[
  {
    "path": ".gitattributes",
    "content": "* text=false\n* -crlf"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"maven\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n    rebase-strategy: \"disabled\"\n"
  },
  {
    "path": ".github/workflows/run-maven-tests.yml",
    "content": "name: Run maven tests\n\non:\n  pull_request:\n    branches:\n      - master\n  push:\n    branches:\n      - master\n\njobs:\n  test:\n    name: Run tests\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - name: Set up JDK 17\n        uses: actions/setup-java@v4\n        with:\n          java-version: '17'\n          distribution: 'temurin'\n          cache: maven\n      - name: Maven test\n        run: mvn test\n"
  },
  {
    "path": ".gitignore",
    "content": "**/.gradle/\n**/build/\n**/target/\n/nbproject/\n**/dependency-reduced-pom.xml\n*.iml\n/.idea/\n/.idea/libraries\n/jcp-tests/jcp-test-jep238/build.log\n/jcp-tests/jcp-test-gradle/.buildProfile/report/\n/jcp/.flattened-pom.xml\n"
  },
  {
    "path": ".projectKnowledge/JCPreprocessor.mmd",
    "content": "Mind Map generated by NB MindMap plugin   \n> __version__=`1.0`,showJumps=`true`\n---\n\n# Java Comment<br/>preprocessor\n- LINK\n<pre>https://github.com/raydac/java-comment-preprocessor</pre>\n\n## Current\n> fillColor=`#FFFF99`\n\n\n## Issues\n> fillColor=`#FF9999`,topicLinkUID=`15150167A1AA`\n\n- LINK\n<pre>https://github.com/raydac/java-comment-preprocessor/issues</pre>\n\n## Backlog\n> fillColor=`#99FF99`\n\n\n## Changelog\n> leftSide=`true`\n\n- FILE\n<pre>changelog.txt</pre>\n"
  },
  {
    "path": ".projectKnowledge/documap.mmd",
    "content": "[Scia Reto](https://sciareto.org) mind map   \n> __version__=`1.1`,showJumps=`true`\n---\n\n# Java Comment Preprocessor<br/>v 7\\.2\\.0\n\n## \n> fillColor=`#FFFFFF`,mmd.image=`iVBORw0KGgoAAAANSUhEUgAAAL4AAAAwCAYAAACvzsA1AAAQkElEQVR42u1dB1gVxxZeiS3RGI2xRtm93MstXBBUwK5YUey9xl4TC1gAsYBdH6Im6osleWqKL7EbSWKPiVhATSyxIAjYEH02LBdszJtZBoPXe3dmdheSl7fn+863IDPnzM78c+bMOTMrx2mkkUZUVBVyTci1CGyCXFpFvWUge1HorY3bqJFGqlF/yICBf1dJbwXIOQx6n2tDpZGa9JgR+IhLqqD3LKNOmzZUGqlF78oAPeK6CvX6yNB5XRsujdQik0zgD1Sg0wXyIxk6T2rDpZFa1EIm8D9RoNNfps5F2nBppBYtkgnC3Qp0PpOps7E2XBqpRRdlgvCMTH09ZeoD2lBppCbJBeFtmfruy9SX9lfuxNQoQUPS/xDVVAB8ORY4XIGuHX+1znu4TD/gwceG1MwY/fIbkdVLqi3/yXJeQ2gB0TCFwLcw6rujQNcsFd63GOQ3Ib8FuRR+ot+L40gTE2WtckuxfaoHj5YaQOZCve3OXF2xW4tqKm7k45W5gL+zzMMle6Vu2KOlus0PFrmXUCCyJH7f0viJ3rnon4S5IpBL4DbkjUFx/O/OqCzkcpjRz2/jn/OoHJZFTSsUAn9AIWyi87iNzI72hLwd8j0uN4SajYwp5Kf4iX5HCbwHkM9DHkEr2LZK/xiC/1nWSj14vAyCP0YfqhY6Hn/NudhW6m9mrYKyl+uR7JuMItwgr8SuZRZ+32f4mY374jDkOgqaiQAXCLkt5taQPSTK/wv3sw23IW8MbNgoznZSLwbyC8jHIYdAzsCYQJNGh3+ex9Lw4wrBuIJBl02hrjIMugyQ92Kwy9GFjlHsxFbJCXXmIDAB5EwEzgdL9KduhhvBncnmEkpB/2iVmx+Um43kQs6x/RPKX2wA9xfoq1NUnw75KuP7XoLclLGZIRLyZuQrh1aZAwxteQi5h5O9aDG8MtvwhPGGfAFPbN/C2NiyJpRiFOp5zGCBtqvwXnmMrKLDXeu9OYbG0BLfta3W38tcZLh0M8wIEPDTJ5sa/qRgo5sRrm/3nynuSWhSZYmTys2G3KmHSwzgXrReJ1E1CPIthe/Lkpu5ISFnDS4zRkFb8oO/Mrb4eW4b+vtnkFMgr8e/V6ZtuF4FYNwm+GaIyhNkZFLo2UzxPjpsBYDKjKzLG/bKroe598gIhWCPMGxCz4xJkCeYwPUQ00dyQX99tKlTxkSTOIEer3BLt610u5O1WlxVwMOPoSsV7VbOQTVkAVep+L7LKf100mFCpWNxP5++UZDj8M/olO6vkHvhcqXyuT1UNI6g+AX216TKPKDYJC0myKhKsTQPJ+hgOW+Ug9+N5VRogL3C9BD3/unjzCB9rDkhfYwZXB9tBtc+tIBrIyyfs4A9qbtVfF4dam59daRFlHMj2GiDK0hSRrgx7WaYIRFOhNO3Jrv/7EREcgFM9rGEZrcuAJ2OuBPW9w4eYw5vhN/Ck+89jD+m8Nduji4ze1uiTBbeoUtZYZoOvksoV09Cx1uU+4dovOGrgDusIh5Amrr77ZWmDbf0uTrcAq4Ms8RdGeoBrgz2AJcHQu5vPcBq6RO7Wb3T+lnBlUEe4Oowy91rH5ku3ggxiasIsv6IMyKMtRxYelrXBvXvZQbApRCavLCQgL+9IMJKFwhK/XC5nwjWU2IDyH1B0FEcuxGkDqhCiBRI1T2E3S0pSiPIOPVawqqvRxcE1tQ+1iNpfeGztydI6Qm5myfTXYWLXT0rJnfyzLnU3RPK8nySNsBj7dXhHuLqAVcT0X3KCDNeFP3/qSaW8UOZ9Sbc65eGquLNp5LjIXspV1b0/BRyI2yVK2AvIoz7E0/jPqBMTpH8x1pO5POEei1xueYKEmUkHXco+2IeQc4G+wopPaxNL3X1BMmdPZMh30ru6AWSOniBi+29Np6qUbPpSaO3pMLUuvW4k/UtpS+0qJGTGOQt1k3u4rkqtbcVrhpwBRkCrf8I0fV5cT3Y1T6itYTQ3mkU70yy2lKBiysUY4YmpquEjKYU7uYttUFfgqAwf8w4mFB2qhMdBzm64wcRBPl7Jd6jF2GD5UXZH6SMch/7CqdbelkvBtUAiYE1nie2rrExsZU3uNDCG5ypVSv1N2vtWCllCULuYnrC3Tf+XGMfcL65N0hsWWNFUnuv7EtdvcSVA60mous01H2wbfWg/NVJp2mHqZRQtEns30igz8ShR9IG+QZBTrrawB/M0R9AI3V0nAP5lRh89rWEskMJnTcUJz7G4vAZeg6i6HiWpfsd+wrHmniWOR/gAxBwzzXymXO2kQ846VX73Am9H4AsuiY/iOmEVykqr77O70tU9pR37RNnG9S8fb6Z94kLgd7gYtsaILmTF0CuT0ov6wLGzexpRhxskJD1xEmkpDFFUKQcpf54gqzv1Qb+PoZ4bmVGVwSBMVWi7FG78kcV+Pdq0ACC/mzO7polAPG5Ftvg9wJa93OnfWvO/9Xke/W4mx/IZf9LTl0cj1ZcvJv/+GNu/qgcZN/0M3V8NkHwAzSR0KqR2AauJJ290D1o7nIvD5a2vsn47sskZKEs79sO6iylSIaplUCdoOZAu3DkO7ZNGZe2UnapcqmyJoaM7lMnna8GITfoS4p3u+coji+OmpvfIwTeY4LfZgTkPE4Q/JPieb+GDk1cFf/yCTr/58d0uLzOf+wJg++NE0a/9N/Mvhlw1cg45VX7zCmfmp/JCF12YXh/N0JU6LkTy006xt6boQ2pBFmV1RzwUhTJhddyK4Ty1Sk3PmsY4+9ZnPzDVMVwu+pD7oCTIMjCHWYMqTmN0kDgpuWC1y9FBDLkBMyHq9V6ZYLH8XW5X6tZi8QL/vcThDpiGThhDsE6mcfzrH+umwSg7w9+1tUuneFbh2VfpjYj4Jd1sJrf5tQ5sYtkZRBWWlXpPcJu+oqDOj8SXjYvhEG6Umjv9A6XCzon8XxkxdFhuP+oCICpTjepOv9jGOhpCbo6LyCDeAjqo0KdaxDgW+Mqvbq3juPrhx4R6oll4nn/p7DMpAQ8Yf5wfSDw3Xy7O1A3v5CB/4R7/cSjC16FndU5x+h5PJSQlag28DsQXvgHB3VmEuoE4XJSGdglDuTuJMgNp+zALxkzsSysd6b4KF9nuwhioc5D+PM3R4W6AAH7sFAfHBIaPIRAF4867xYCuAN8E/MvQmMQJzQU/36Er7sE1X1p/XMn0MVjOl/xdCgEv7267EIGfhbOs+Qn0jGXbQw4JOVvdqsN/H8TFDo63tmNUAf5nnsIZRx9fe0Soc77hHcZUsCAeOo8HGLlDgt1J2OQgzi+Qb84oRE4KHJj8LPQBOyqVvdlNGgf3/zYT0JT+O8B8O8NYw8J9RPQJEGTRZwAOnEC3NnP+5Y6IvjYqyuNoyWFCXxHK3+kggicPTXjCv7+xSv0nKCwg4M6/go7cZSTttxX4OMtYGwDOti0Dq8i7SEbITcg1EmSasCB6g28Ech/gSCHFn3BASHgGQL3fqEZ5OZgH99ssOgn8q267BZagb1CC/FvB/iARfmtPwL/Ud5/91FXX+90aytHqmi/OHcD+81yOO+uwm0c3n1Hxub6PQYcrlGQOWamchSd5yi9X1UB6J3dzS3KyT8vQnNzLAWn5o0ScooqXW73i0CHIBea394rtLy1R2gJ9kCQ7xYCwU4hUPwcyg9C2ws7hTZgl9Aa7OZbRMKy93KtfxNxdTgEJ8ARvt4zCTWuhHamctJnptSgYhR7AhYifVdJVSLdsZX6NqVc4A9xIq+HjMRY3gCQDpatpuyPIIKcKJKAPXzLXQjku4TAFzv51pcRwH8UggAEO4jl2y7Z6tqp7XdCRxArtEP/fheWOYjKw0mSa/2h64Os/0G+YZAC4H/IFTxVIbRhH4Os0lwhf1iABDapVPtdGaBPkJC3g1B3ppN6nxDqrWHojzMMGWaHFMu3GYVA/r3QLidWaB8DGewQOgAE9m2uHadtEbr+vk3oDLYLncAO13ZdYdkcNDkQ+NHKsE90f5oeQbIOujZ0poZ0ynV8IQDfqqJPLhBkfa1241dz8s9hr5MBfCk/jZRL8HdQpzgn/0CbHLdPktBysNW1rSsCuQh0vuNABPKtQhewBfLXFQPLbBR6gM1CN/R7HPz79Vzr3x6uCEG5rg9yi6q0JF2iqErw8VfLtODoiMfHOOKGDq2Fcc4vbX+kYvKMdOxhtNrAJ134aCRRty8j6KWWvrcpohTOso1SdQ4w9AXpOmQSraAtfNcjWyC4N/HdEjYJ3c9tgmDfKPS8v0g/Lma90Ddng9ATbHLtNhZaf4AmBgI/WhVi+XZZsdXbVqJQUZbQX6wX0YfLMH6kqJ07g/6FXCFubGn8dKljpGZG4JskZL1PsGDOkhd+MnIQckJpAK9wVPSNa88aCNzfCr0Rb1unGwjWCQOmRxvGg7W6gU/W830Wfyv0yoSTQbT+W+EE2C50vLStekdhBx9Em+V8SGjvfMqcRyQhfFtSJnZYKIUgq6yaoK+rsPFVGJJEpJszpE3leif1OlLoLkoAUEvKdxhH27GRLn2KLDIEX/hC+CDrK/6DpZ/rhtyaawwF840TwRL92Mtf8X2XrBf6gW+E3k/hBHm8ke/WU8b4jaVo8wq8mhbN974oUYQOr7WhGD9fCUMlVe8Ew3u4qBwdIlKwwsaXoUyiPKeYsaQY7gSZFj/vUJmjREoX7BLQTt5Amk6do8udH/Pdx7kucJ8I5ruPj5xtCgczTZPBHGMYmKuf0D/aEJwUYwjeFeM+pk+MMaTPQkPIqWghWC9jDGku5j/DocL7mB9wdBe/pb6RFEioO53hHbxlGj3Z9AWn7AhoUUrgL6VoC+l0aIDEJo/18yCZnLwwbC3ajp2tC6k8xxi6dLYpDMwyhiVHmqfER5ojwAxjBIgyT96GJgH6G1oF5hkn7ZvrNul9mWM4iiuYLG0EQe8kju6aKg31U3GTTEUnCAp1FDIyOPKlZqUxXMBJH0W+yxVOyr46awdHGkI7RZmmPIswT9s41TINTLeE95hunmqLMk8BMyD4Z5nCz841h3ZfYJjyhoJx/FTl96Q58x6rYl+Rrk0a1AZ+NmF5pPlS2QZCo2k+oUc6/nCfIgyp5EAaOrl5VOHke436lx/GTTFObT/ZEpkZboncF2aOTIbPtRGW6cenmaedhKvA/hnmCHT5m5tnDVE6lotVAPw17o9TtSQibaxZPpibwDHedivIiA7tbfZ6HP3NKmdEulw+hkIGsjBZjAOdbeeLkqyYLAq1RLWb6DFzykTLjHERQhQfaplVoYASSj7YlWMxAjkYxJ1VxM4aRllS/+Hf6YLoqGo4jBeAGVmfDnjWs9xP1WM/rAeOkARgN4lWhgsOmwY4YIGj/2ox0tea0JF3cMwYtc/+LAtyN9BhtZ523IaTeetrnDFK/OhRsMfsl/uccPPMIlzBEZL9Lg5RXuOkrwOiLy+U52R8FZrL/QZRW7t+CpTplqAVu52Dfm/IiEON8Ma7Ip5QiCtxhfwZ7DGGKPE50hpdebTn/MjRXvPm/Qn9gCZ3BRwEqFQQboNGGjmkEV7Ri8Wn5z9iRlqii2g9otH/BXX3iBK/8tvFOt2tq+c8l7GGN7RO0ejvTTWNI797ufM0jipjNQzppPWKRn9bcnfPTXrq9f0b5P93k3HQRq13NPpbEwT5J+76AcWrVfvjAwkm98HekN/Veqfw6L8MpcrkyHZvbQAAAABJRU5ErkJggg==`\n\n\n### goals\n> fillColor=`#FF3700`,textColor=`#DBDBDB`\n\n\n#### preprocess\n> fillColor=`#FF3700`,textColor=`#DBDBDB`\n\n\n##### sources\n> fillColor=`#FFFF00`\n\n\n###### Source root folders for preprocessing,<br/>if it is empty then project provided folders will be used\\.\n> fillColor=`#49EFB6`\n\n\n####### \\<sources\\><br/>  \\<src\\>$\\{basedir\\}/src\\</src\\><br/>  \\<src\\>$\\{basedir\\}/res\\</src\\><br/>\\</sources\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### eol\n> fillColor=`#FFFF00`\n\n\n###### End of line string to be used in reprocessed results\\.<br/>It supports java escaping chars\\.\n> fillColor=`#49EFB6`\n\n\n####### $\\{line\\.separator\\}\n\n######## \\<eol\\>\\\\r\\\\n\\</eol\\>\n> fillColor=`#FFB600`\n\n\n##### keepAttributes\n> fillColor=`#FFFF00`\n\n\n###### Keep attributes for preprocessing file<br/>and copy them to result one\\.\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<keepAttributes\\>true\\</keepAttributes\\>\n> fillColor=`#FFB600`\n\n\n##### target\n> fillColor=`#FFFF00`\n\n\n######  Target folder to place preprocessing result<br/>in regular source processing phase\\.\n> fillColor=`#49EFB6`\n\n\n####### \\<target\\>$\\{project\\.build\\.directory\\}/generated\\-sources/preprocessed\\</target\\>\n> fillColor=`#FFB600`\n\n\n##### targetTest\n> fillColor=`#FFFF00`\n\n\n###### Target folder to place preprocessing result<br/>in test source processing phase\\.\n> fillColor=`#49EFB6`\n\n\n####### \\<targetTest\\>$\\{project\\.build\\.directory\\}/generated\\-test\\-sources/preprocessed\\</targetTest\\>\n> fillColor=`#FFB600`\n\n\n##### sourceEncoding\n> fillColor=`#FFFF00`\n\n\n###### Encoding for text read operations\\.\n> fillColor=`#49EFB6`\n\n\n####### UTF\\-8\n\n######## \\<sourceEncoding\\>US\\-ASCII\\</sourceEncoding\\>\n> fillColor=`#FFB600`\n\n\n##### targetEncoding\n> fillColor=`#FFFF00`\n\n\n###### Encoding for text write operations\\.\n> fillColor=`#49EFB6`\n\n\n####### UTF\\-8\n\n######## \\<targetEncoding\\>US\\-ASCII\\</targetEncoding\\>\n> fillColor=`#FFB600`\n\n\n##### ignoreMissingSources\n> fillColor=`#FFFF00`\n\n\n###### Flag to ignore missing source folders,<br/>if false then mojo fail for any missing source folder,<br/>if true then missing folder will be ignored\\.\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<ignoreMissingSources\\>true\\</ignoreMissingSources\\>\n> fillColor=`#FFB600`\n\n\n##### excludeExtensions\n> fillColor=`#FFFF00`\n\n\n###### List of file extensions to be excluded from preprocessing\\.\n> fillColor=`#49EFB6`\n\n\n####### xml\n\n######## \\<excludeExtensions\\><br/>  \\<ext\\>png\\</ext\\><br/>  \\<ext\\>xml\\</ext\\><br/>  \\<ext\\>txt\\</ext\\><br/>\\</excludeExtensions\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### extensions\n> fillColor=`#FFFF00`\n\n\n######  List of file extensions to be included into preprocessing\\.\n> fillColor=`#49EFB6`\n\n\n####### java, txt, htm, html\n\n######## \\<extensions\\><br/>  \\<ext\\>cpp\\</ext\\><br/>  \\<ext\\>frt\\</ext\\><br/>\\</extensions\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### unknownVarAsFalse\n> fillColor=`#FFFF00`\n\n\n######  Recognize a unknown variable as containing boolean FALSE flag\\.\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<unknownVarAsFalse\\>true\\</unknownVarAsFalse\\>\n> fillColor=`#FFB600`\n\n\n##### dryRun\n> fillColor=`#FFFF00`\n\n\n###### Dry run, making preprocessing but without output\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<dryRun\\>true\\</dryRun\\>\n> fillColor=`#FFB600`\n\n\n##### verbose\n> fillColor=`#FFFF00`\n\n\n###### Verbose mode\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<verbose\\>true\\</verbose\\>\n> fillColor=`#FFB600`\n\n\n##### clearTarget\n> fillColor=`#FFFF00`\n\n\n###### Clear target folder if it exists\\.\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<clearTarget\\>true\\</clearTarget\\>\n> fillColor=`#FFB600`\n\n\n##### baseDir\n> fillColor=`#FFFF00`\n\n\n###### Set base directory which will be used for relative source paths\\.\n> fillColor=`#49EFB6`\n\n\n####### $\\{project\\.basedir\\}\n\n######## \\<baseDir\\>$\\{project\\.basedir\\}/src\\</baseDir\\>\n> fillColor=`#FFB600`\n\n\n##### careForLastEol\n> fillColor=`#FFFF00`\n\n\n###### Carefully reproduce last EOL in result files\\.\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<careForLastEol\\>true\\</careForLastEol\\>\n> fillColor=`#FFB600`\n\n\n##### replaceSources\n> fillColor=`#FFFF00`\n\n\n###### Replace source root folders in maven project<br/>after preprocessing for following processing\\.\n> fillColor=`#49EFB6`\n\n\n####### true\n\n######## \\<replaceSources\\>false\\</replaceSources\\>\n> fillColor=`#FFB600`\n\n\n##### keepComments\n> fillColor=`#FFFF00`\n\n\n###### Keep comments in result files\\.\n> fillColor=`#49EFB6`\n\n\n####### true\n\n######## \\<keepComments\\>REMOVE\\_JCP\\_ONLY\\</keepComments\\>\n> fillColor=`#FFB600`\n\n\n##### vars\n> fillColor=`#FFFF00`\n\n\n###### List of variables to be registered<br/>in preprocessor as global ones\\.\n> fillColor=`#49EFB6`\n\n\n####### \\<vars\\><br/>    \\<glob\\_var1\\>SOME TEXT\\</glob\\_var1\\><br/>    \\<glob\\_var2\\>12345\\</glob\\_var2\\><br/>\\</vars\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### excludeFolders\n> fillColor=`#FFFF00`\n\n\n###### List of patterns of folder paths to be excluded from preprocessing,<br/>It uses ANT path pattern format\\.\n> fillColor=`#49EFB6`\n\n\n####### \\<excludeFolders\\><br/>   \\<folder\\>\\*\\*/folder1\\</folder\\><br/>   \\<folder\\>/some/\\*\\*/folder2\\</folder\\><br/>\\</excludeFolder\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### configFiles\n> fillColor=`#FFFF00`\n\n\n###### List of external files containing variable definitions\\.\n> fillColor=`#49EFB6`\n\n\n####### \\<configFiles\\><br/>  \\<file\\>$\\{basedir\\}/config1\\.txt\\</file\\><br/>  \\<file\\>$\\{basedir\\}/config2\\.txt\\</file\\><br/>\\</configFiles\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### keepLines\n> fillColor=`#FFFF00`\n\n\n###### Keep preprocessing directives in result files as commented ones,<br/>it is useful to not break line numeration in result files\\.\n> fillColor=`#49EFB6`\n\n\n####### true\n\n######## \\<keepLines\\>false\\</keepLines\\>\n> fillColor=`#FFB600`\n\n\n##### allowWhitespaces\n> fillColor=`#FFFF00`\n\n\n###### Turn on support of white spaces<br/>in preprocessor directives between '//' and the '\\#'\\.\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<allowWhitespaces\\>true\\</allowWhitespaces\\>\n> fillColor=`#FFB600`\n\n\n##### allowBlocks\n> fillColor=`#FFFF00`\n\n\n###### Enable merging of text lines for //$\"\"\" and //$$\"\"\"\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<allowBlocks\\>true\\</allowBlocks\\>\n> fillColor=`#FFB600`\n\n\n##### preserveIndents\n> fillColor=`#FFFF00`\n\n\n###### Preserve indents in lines marked by '//$' and '//$$' directives\\.<br/>Directives will be replaced by white spaces chars\\.\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<preserveIndents\\>true\\</preserveIndents\\>\n> fillColor=`#FFB600`\n\n\n##### useTestSources\n> fillColor=`#FFFF00`\n\n\n###### Turn on test sources root use\\.\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<useTestSources\\>true\\</useTestSources\\>\n> fillColor=`#FFB600`\n\n\n##### skip\n> fillColor=`#FFFF00`\n\n\n###### Skip preprocessing\\.\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<skip\\>true\\</skip\\>\n> fillColor=`#FFB600`\n\n\n####### activated by\n\n######## jcp\\.preprocess\\.skip\n> fillColor=`#FFB600`\n\n\n##### dontOverwriteSameContent\n> fillColor=`#FFFF00`\n\n\n###### Turn on check of content body compare with existing result file to prevent overwriting,<br/>if content is the same then preprocessor will not be writing new result content\\.\n> fillColor=`#49EFB6`\n\n\n####### false\n\n######## \\<dontOverwriteSameContent\\>true\\</dontOverwriteSameContent\\>\n> fillColor=`#FFB600`\n\n\n##### actionPreprocessorExtension\n> fillColor=`#FFFF00`\n\n\n###### Provide a class as the preprocessor extension through its full class name\\.<br/>The class must have the default constructor\\.\n> fillColor=`#49EFB6`\n\n\n####### null\n> fillColor=`#FFFFFF`\n\n\n######## \\<actionPreprocessorExtension\\>com\\.igormaznitsa\\.jcp\\.extension\\.LogPreprocessorExtension\\</actionPreprocessorExtension\\>\n> fillColor=`#FFB600`\n\n\n## \n> fillColor=`#FFFFFF`,mmd.image=`iVBORw0KGgoAAAANSUhEUgAAAE4AAAAwCAYAAAC/gkysAAAOyUlEQVR42u1aB1QU1xrGksTEHo2JCqwtKpZYYiwxmjxN4ovJM5pEE9t7JjFGfSemgh17jw2DvYJ0kCYggjRBBGmiCCwgICIIClIFEf73/Xdn1wUWWBHfieWe852ZvXPnzr3f/H1WR+cJauUlZZV+p3vFd7tqG2kesytgms7zprkVpOSozomo8Q0f+eCwJa6Jdt1X0elP9zo9Z0hDyw5JUSftxeseVz4L/MGq0OK1xWTdeRk5GKxNSveKHcbXM/zkzwkDSToT1X4XXstpkWwbOd/78/0kSNNdLoiz77mmxGfK4V3PGdPQbgZdbS8/HLz95MjtZPn6EgVpEmz0jclp0KZoEN2Jx5bm3X12iaooK1dJ3TXXy11idvi5n+izjqw6Lq1EmlLqHHqvzQ2cbWn0TEtXUfodJWlNku0i344wdotlgqw6LatOmiBuOdl2XUmQRj+2gUrCn6l2KzxNSVqzq1bhE4J+tMm17LBYkKORNAlMqkOfdenhS0+K0OTsd8efHUfgN8NMed5Gfij4J+9JBx84gbrATuLN1XTqY1PrZ8p7qjxnep4u7Nl299E7qjmBusBS59h/Q1zC0fOjea7Ms4lPMWkVD0jLOpfUL3LNKRfHtzZodgJaSB2cRJnX5/u3PdWSdjerQHWe4hA1JvQPx4ts5Gt0AtpAz5ich2wJyQpJ7s7zlhWWPl2k5VxMV6rpC/EHz80I+NYiw6qzQmrqTZqkrif6rs/3m3HM8KmzZwgxlOevXtrqs8hrwr5iq47L6vSc2qmrKjRxZyfzVIQm6hvAebcIY/fdbqN3KlSzIUhTSh3so+PAjTeCf7afzs+KXHXq6SAt+8K1YefmWrs4Ddz4aPasFidh12M1uY/ZdYSD6CeWtNKcItV5jInfhKi1nmF+046SbZeVj2zTarN1cBJXLq4/PUbKdZ8wz5ldoKqhxe8PmpvqGJ0S+rsjpbnF0BkEuJyg8yYt31jasMQpQhM6PX7vxidONYFGfF58K7917uWM1fkJWTlx+wLp5Hvb6XbUdYI0CJWy7b6KXEdsFSTWZbuOv7qQLDssqeYQaroH855FQNyX13G/SgX5b0laefE9lROgiopD5XfLSq7aRJDbqB1k3sqQ7sTdpCTLcOEBozd6UarzJUFijaRBIh37raewRS7kNWE/WbRbJAjkuZhMs5aKo7rkikzirQ0lPpMP//Kkec7hgAdQnnAslFze2SLSKPuea6go/Q5l+CYIO5cdmkIIVMkeqqXJ0Fu0X0QnR23HeDnIDiP54fPkOnwreX6yh1KdoinN4wr6gun8Lw7kMvRPOt52oSrzsNFfwS/rRO7lGx3/dqEJVKVaX1ZIysTcmIyIdM9YCoFNO9F/g8KWgTiPMbvo7s0CygpOFlIG20dIvcjBYF011WSEgJDs0FQqSstlg09XTPzFvVnnk0nZKsorCJmIMAGX/jwj5uICAceHeGG3zn5v+Q2vK3ypq2LNutXXbK1LwLL/A2EaHh4816YlNrYAapl6bp4NqwrSIAUJTNpxqJjPV4eoNLeY0txjBHEXDJ3E5p0Hb1KRxqUkxwEbhUQxIdxKc4rp3FwbCvnNUWKrgjS18pIySjS/wAm/kFY2Bx4f/rUHl5pXWX8jYCAwCWhX274eC2k2shU9zdsY7cRbDkl2iIouKyq9XZiaQ1etw8nrX/sEYbwBt/d3ktPATeQ3/Rjdy7tLsaYBUNUVFDzfVmzYHdeZZLZfZyYdoJzodCFJD8SKBImF13KorlZxvxzPjxDks+1zHbEtPtTI+T1p7eOAbcBeYAewAlgDfAmo4j4bPWMdeOeGI0xJGjbZAlgKm5LkMnRLCRN1v/ieapP85vMSsijBLJQy/ORUdD2XskNS6PzPDoK4gG+PC1UKmHUcwlNBpz4yFaQF/WgtbOCjNiYd4Q8kebPwvDARJ5zf3rwY0v8f7KE/0A3QAzoAHYFhwAJgMghrWpd21UvScOwJOGOjpZ4fm1JmQFKNqoMwQHWtKD2PkJ8K4hKOhhB/F/X6dC/dv1tGSRZhINWeim/kacGK9uRl+CVQMjx6quPFqHPzbMf/rNP7xRr29gLQFhgKrAV+B9prY6K0I03PuBMM/REOB/ymHaM8eVYtK6+oRmLJ7SJxnn/1FlcyKGaHL5WX3hfXmNDaGl9nZ1OTet7L13x/wrEQYSq8Jx2Yo4mAKudNgTbAEGAr4AOsf2R1hb1iG1HGKldyq7DWjTKp6adjEW6UVLt2xfQshS93UxFZVysvu0/hy1yFh2YTUInQghK6tMWbv+pTXnz1F5lsH8XfJMht9E67NNfL+jWFJlUIbAK0BEYDvkAcMKZepG3SmfAKFm6MfFNISZ2bhRRFb/Im36+PVJPM4J/sKdM/UUiKNiqXdvKyCITZ6/rPNKeKsvJK1xOPXxBB8aXNZ6rdfysijTzH7SanwZsKfKcenSQEoJWhVs4P542BV4AfgFxgltZBbdRaRWnmhk98F7xtr/J75VpJCQesToM2wbMtoszAJNF3YaEzFSImY+K1IU0RihSJoBeejrwnHqCLyDbuxGZWGlOSXUhx+4JAYGi1+9nL+880I0vEdrCpJuhq/bDRgySB7FQ2P1QmkO4V1yMzIPHM3cx8rTbLG/H95qiQAg4JWC3LISUhv5+g+APnHnhgTYRDegQxMJGcMVza5ks3g65SGe5hstkLI+wRzxASp5Q+9FcKYaRWkHxbhEGcVSCTSAqcbSU+6GSHX3tYp8ixX9NaB5eXPkiKsejhsGkJ3p8foLKCEq2Ii1zpTojxRNrEWQMHohzZZ19IpcjVHiJOUzqDwmu5lOpyCaRUCHvo0HMtxe0/p3AiidmV5uVYLmyhi5gbaidIZOMfhICbVVJTY2l3H2Misgn+jHhm0sGFD1urq9ObIr1Rl7im1z2vTDz7nUU+vy02vtqEC5z22GGB6oVKzgbOfHGQ7t0ppsA51hSx0gPnCuLu3swX8ZwIXTgY/sBE3M+hC6u1sJelZUL1HQzWink5G+Hc9Fb4NWE/ObjmJJ9VOmKFG2WeTRJOg9vtyOvi2bwGvg8xXVDYYpf+DZagR284/eD3/YrmybaRC7gawerGhpn/9JLhn1AjYSwNnEIp62xVk3ZOuYL/a0tKdRcqBom5vN1XZBG3II2snpxxeEG6YR4IOa+I8TzH76lcUuLvC7gnVApPYnb4QRWNRL+ixrdEIfGwi1xVSfeKJx84Kf7N1Wekfv/WZJLqXdXgBpVqJz983kT930FcHOSANWqdpypuUtqTYkgMqxZSG7LosLjOuhrX5Lgex3aH5xTekjcMhC1xFc6gHPOzJHI4w47Ef7qZyquql5t4jXfiMhGiZGNezR+yrUCiE9Kv4AX2dHGDF3mM/Ytfjn38/iARmlza7P3wpIEAdQIbpXvGymJ2+nlwhaHqh2FeKFcoWBXZ/XOFgnNHqDKZtzbU+huCslIi5u9c5StVt5WiTARVEuc8lu0fP4ftZKVye2eF7WRPLQLdI+fJGuM1FkW5RAUbx4WHZLsIit0beC9wjtU/6yVpRTfuqJPWBAt8O2KFe5xS3GvaNHtJ9/dNKMXhIoLSk1DBhQ34sWW52KCQHIlUliR2GtGbvav9n4TJ55CHSWNHwvU5z3Gm1SvFEjgf9pl8mNK945AqJu6AELSVtKxeqtos5UTUZ/BM+XX90YUXyolz7O6zCDa9ReWjIT/vaYINbBnbQc5UOAOo+lL5t3kbI3IGgVwDvGoboSpoCkeiPr6zgrwbPnL2ttfxMobVS+ruFZS2RtA4n72ORfvFWn0EYSmLRoojnMZj+lJVVQo5r+XYLsbEX/GyNIxjr8lmg52KN5waV53Z7rLHVai5YpxZK0MRS/K4RPPQ31Kdol8SZquiQjvS0txiOl3ZFbDTbdTOGkVbHRwKhPx6Qhh25dt87KSp/WXVf4YZ5cXdFAVQjc/GS2RPykIQtz9IFEKvn4ol2GzxvYM9rXpoFAfyQo2co7y/OGjwUNIG1pfB29yAPZFjwpoQL456xhl4WCq8ajykTG7VcVlt9zQ88Ew4i3gk80kIYHOx5ljN45bLQYzcvLURYCi377VG7jF2lxxOQQ6yVeN4z8i75a4jtl4/Nc703Yci7oDOfAPEPv0wUU3oA/QFPgVmm7X8Y6ypzqzeCDT7Westr+2+xwJoRd89OrOHQlVXQgKHo8+grntg6/odfenXfrBrWLNxpWsgt69ZS8MB2FdrnYZuUl1qqovu2lZ/lw9EkZ33trLRNX6vIee0012pY1WfjzXdZV0aKc/bytq/MFI2yOCwrtFMG93lFra6K4Zwfw9Z154Yx2irdt+LQGegtfRb2d8K6AO8ATSW+poBekATqb+t8rk46kpzGyjnqtp6ybo30pV1btFP1rO7pe6y3iBvEPc37vJyc6ytkzRvB6ClNCfP3wt4E+gGtKhh7/UirAfwFW9I+t2ki0x/9ACZgf8SvZlBkLSpEmn9cc0O+BNYyMRI44cAlsAstTnbAL8Be4D1QHepvzewu5tM1h5HY+BrJl66xmM3A0ZAX00bk17St7jf8h/67wxw1F39lYXu0vEj9QdN7irTP4R1f4jr84CPpPHDgMOANbCGSZT6RwGfAO3qRR4GTwfspUV3kfpaSA+7gIXYqY0dAxQDwUAQIJP6maA8YJ8aQRMBf2kT89QW/C5wTSKTj6uBl6VrqcApYDtLSA3EtQOiAD+Qt4reyG8O4n6doj/2KPqov6xXGPr55X4vjWepNgHCgflKTcHxS8AKOAb0q4+0GUqL5ePrahJ4k6Wrm2Jz+lL/B8AdaSFTpL6ugC0QDwQCM9QW5gFMBqYqicBxOJAImErErVAjTi7NYVlV4qTrjaWXd1+SIPEPxXV6c5uM0x+xrpesW+FgWV8mNJkFQu2+KZJwDFTrG8GSD3jyeb2MIm58S5Ka3tLieLOXpT53YI40brQkaerizeLuJhHAi1gn9b8qLewCEMKSJvW/I0ksS/Vx4A814kIBb8Ac+FjDOptJEsrPWyLNM5yv6cl0p/GLgrqOxDFM+WKl+3g/ZsBgtT42Td8Dr9VHVf8HIjGNJEgJIG8AAAAASUVORK5CYII=`\n\n\n### tasks\n> fillColor=`#FF00FF`\n\n\n#### preprocess\n> fillColor=`#FF00FF`\n\n\n##### sources\n> fillColor=`#FFFF00`\n\n\n###### paths\n\n####### path\n\n######## \\<sources\\><br/>   \\<path\\>\\./src\\</path\\><br/>\\</sources\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### eol\n> fillColor=`#FFFF00`\n\n\n###### eol=\"\\\\r\\\\n\"\n> fillColor=`#FFB600`\n\n\n##### keepAttributes\n> fillColor=`#FFFF00`\n\n\n###### keepAttributes=\"true\"\n> fillColor=`#FFB600`\n\n\n##### target\n> fillColor=`#FFFF00`\n\n\n###### target=\"$\\{jcp\\.target\\.folder\\}\"\n> fillColor=`#FFB600`\n\n\n##### sourceEncoding\n> fillColor=`#FFFF00`\n\n\n###### sourceEncoding=\"UTF\\-8\"\n> fillColor=`#FFB600`\n\n\n##### targetEncoding\n> fillColor=`#FFFF00`\n\n\n###### targetEncoding=\"UTF\\-8\"\n> fillColor=`#FFB600`\n\n\n##### ignoreMissingSources\n> fillColor=`#FFFF00`\n\n\n###### ignoreMissingSources=\"false\"\n> fillColor=`#FFB600`\n\n\n##### excludeExtensions\n> fillColor=`#FFFF00`\n\n\n###### extension\n> fillColor=`#FFDB00`\n\n\n####### \\<excludeExtensions\\><br/>   \\<extension\\>cpp\\</extension\\><br/>   \\<extension\\>xml\\</extension\\><br/>\\</excludeExtensions\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### extensions\n> fillColor=`#FFFF00`\n\n\n###### extension\n> fillColor=`#FFDB00`\n\n\n####### \\<extensions\\><br/>   \\<extension\\>java\\</extension\\><br/>\\</extensions\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### unknownVarAsFalse\n> fillColor=`#FFFF00`\n\n\n###### unknownVarAsFalse=\"true\"\n> fillColor=`#FFB600`\n\n\n##### dryRun\n> fillColor=`#FFFF00`\n\n\n###### dryRun=\"false\"\n> fillColor=`#FFB600`\n\n\n##### verbose\n> fillColor=`#FFFF00`\n\n\n###### verbose=\"true\"\n> fillColor=`#FFB600`\n\n\n##### clearTarget\n> fillColor=`#FFFF00`\n\n\n###### clearTarget=\"true\"\n> fillColor=`#FFB600`\n\n\n##### careForLastEol\n> fillColor=`#FFFF00`\n\n\n###### careForLastEol=\"true\"\n> fillColor=`#FFB600`\n\n\n##### keepComments\n> fillColor=`#FFFF00`\n\n\n###### keepComments=\"REMOVE\\_JCP\\_ONLY\"\n> fillColor=`#FFB600`\n\n\n##### vars\n> fillColor=`#FFFF00`\n\n\n###### var\n\n####### \\<vars\\><br/>   \\<var name=\"globalvar\"\\>antdefined\\</var\\><br/>\\</vars\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### excludeFolders\n> fillColor=`#FFFF00`\n\n\n###### folder\n\n#######  \\<excludeFolders\\><br/>   \\<folder\\>\\*\\*/excluded1\\</folder\\><br/>   \\<folder\\>\\*\\*/excluded2\\</folder\\><br/>\\</excludeFolders\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### configFiles\n> fillColor=`#FFFF00`\n\n\n###### paths\n\n####### path\n\n######## \\<configFiles\\><br/>   \\<path\\>\\./config\\.cfg\\</path\\><br/>\\</configFiles\\>\n> align=`left`,fillColor=`#FFB600`\n\n\n##### keepLines\n> fillColor=`#FFFF00`\n\n\n###### keepLines=\"true\"\n> fillColor=`#FFB600`\n\n\n##### allowWhitespaces\n> fillColor=`#FFFF00`\n\n\n###### allowWhiteSpaces=\"true\"\n> fillColor=`#FFB600`\n\n\n##### allowBlocks\n> fillColor=`#FFFF00`\n\n\n###### allowBlocks=\"true\"\n> fillColor=`#FFB600`\n\n\n##### preserveIndents\n> fillColor=`#FFFF00`\n\n\n###### preserveIndents=\"true\"\n> fillColor=`#FFB600`\n\n\n##### dontOverwriteSameContent\n> fillColor=`#FFFF00`\n\n\n###### dontOverwriteSameContent=\"true\"\n> fillColor=`#FFB600`\n\n\n##### actionPreprocessorExtension\n> fillColor=`#FFFF00`\n\n\n###### actionPreprocessorExtension=\"com\\.igormaznitsa\\.jcp\\.extension\\.LogPreprocessorExtension\"\n> fillColor=`#FFB600`\n\n\n## \n> fillColor=`#FFFFFF`,mmd.image=`iVBORw0KGgoAAAANSUhEUgAAAKwAAAAwCAYAAACMlZHgAAAL2klEQVR42u2dCZAWxRXH9yAuYXddYCFAEOQQDUmQc48Zli1RCWUOAaMRE9AyGMTdnYHlDtFSUSHImooXIlki0SRUzFGxkiorIEVhtEyElMGgQU0CiBhEFANIybl5r6fnm+Pra47v4yPpqfrXbrE9Pd3Tv37z+vWboago7mGb7s8uoAGgBlAraB1oI2gbaCvoZdDToBWga0FDQT2K9KGPvB+2eR9oB+gIqCOC9oA2gKZmTQB96COHwE6KCCpLH4GuAZXpG3pWxrAE1BXU3afqItsoDZSzSLnqUDlU6bnSUffnhhSg7aCWeqq2tnkfx96gndRwuDoNwF4aAnYg/PuZULn3QcMKqj+zXry4GCXo8HjQyZSgRT2embUa3HwA2we0L3scjJEhYAczxuo4aEShgOr+XAaaJOn0b1IEtoMu1AZqaPNmYfee08D6YH0E1AF6BdTF/XeGW4A6kTK07xOfSUOrgVWE1oXV1VQ/zAxom1MGFnUINFhTpYGVWdaFIVhRx4ULMNvsDBoFqokgjA4cVViMlWsrq4HlwTqSAaurp3Jww36pYGmf0mRpYFnQop96RADsx6ChWW5Bsht2nqJ70Krp0sBmrCvVKgGsrh5L8Wa5P29SAHY/qFdqroGlUM+smGPRUs/va6z7ZKTXjnMBWMtQArYrtaAiWE+Crkp5hrv+7w4FaJckHvxmuBmtY53fbyPW/XpQG+hJUDtoMfHF3WNOY5K+TaI5FPez/z7OXxZzMe4A/Rj0E9D3nfPdv0Ob7fp4g26btaDvgtbSfmLdV9O/VeUNWP+42eZo0CLa31+AHgPdAu2uEoLr810fVrCuf4rUqCjWxTa/oegaFKdg0XFL8VEFi341cVlU+tDa4K97Waiuf7LbYeBEvVkhF+MuUIVSO9xBdlytr9HwoKjuVaD3cgqsd98/RSfxu5I2PQ396M8FF0CsVIAVNVAZVNv8NKhnJHBt8w8KwC6NCWsx/XkL3VZUDa09D+qvCMk09q6R+RajPcNB2yO0Awf5y8L76LbDMi6AMn9MFlJMCVgP1r6glyK04WPuWAOI8xVgXSqJw6K60Rl7PHTxP4OuDJRldw6t0yeSjrwD6hQT2rkxB3AfQNCb6U96lnU63Wvv4ALr9tsCGOT95OkGoQ9uGXgPjyWPgacArFXn3psBCdqyGnzxEj+sJaDnJbC+S31ckU/SpnBxBPdSjkV2rKBt/kBh5o2K7MfiQDvnn4l547ZzF0O2WSc591++dpTTSRd3AE+SGDarLc6E353Kpo1l1iUGdnYDTiB80r6RsD0zM4wAhJ8BvS0Bdr4Ehm0RG9AgqKvCyRYSnj8t4qKujPOodoXXe436raLrrsmuvxb9ssOS8zb52rNFIVd4p2RivcqZ9PdK6sbF1d8VgTUSAduSmcz3SJ6Wi0mWnm0+JBn3fq6FHQI6LYD1LYlvsizGjHmb5GDy6/ym5Py1arDWu/XN59Szi1wr2Ia+dMXKKv8B6IKAW8DfkkY/+dZMn2bjKt+sF0yY5cRCZga8DvNPZ7EXRETXBaMfZM3Au18Pk/BVsJ/owhzIGbDOORWc+o8z4+p2fRl9Y4V1znoX2AkS63oJ03d1On1+AjO/UhBVQNdgImgKQ9eQgY/mDpzgLGL6B2KWrQ3+cxZw2j3FV6aUu1C0fDkQ2Ees3wlxseqcEXiMBge9huOThiMPSzh1NwUWZf7JZhk9uJY8DWD5a4bbGRET/3lrOMalB4LYIoD1V6BS7s6WbT6YyDdJY9NBXm445/qLFSIKrzDO+5EzgLVu6OgQo8ycrIWRA/dmRtnNmTgrvz2PM87DHIzP+sqw/MR/kDay4pleZOPGHAL7LOfef52GDFnCsNdXGYtSfApdgsDeKwB2kMQdOJLQmU53E0K82AoPSLXCuQuYubreI4z1yDvGzDDDyAZ7QTTRsfBjRDtdfRnnfZJZfF03qJguRtlPMW69xE0ZxJx0iX1Y0t9tRelm712BwK7mwHon1xXwgsBJG7AgD8DOimXdyeOT+HnZjyavTD/OhkMfDrAHGeW/KN2KdM4Pn4duzuV04pRz3IabFertxd7pCi2MowLrxOG3pwqsBcZHAOwECbCdUmjE/DwAO41z7QqFc2czznvDtxJmxRf/LQCWBcZ4hZyA7hxYnH3jpjGlHGCXKkzK/uzFlzGcEd9lhdiu5DwV0KD9JWULe73IJTgaY9ZH1fQ8AFsrjO21hKxbMyyOVk13z31OaGGjAYtQvcAo/3Np0ott3i0E1imzhzu5RNvl6Jax7k8zAKc23isE19jIKH8KnggjoG81EQXjWF+FwFoCH/Y+iQ+7KSGwPZNkmEWA9jQTPMuo4GZD2eZt3FBYLGAN9DN/yKnz2uyNmAysgzhxXgfY5tFuueVsOKhRYC3qnE2M/cyk+bkN3mRuzoQHf8tph7MrNrcxXP8iTn+/lSS18HIBsAdA1YKw1qgEsG5izUxfMs400P0MrQTdqtS5pszW4Ep+kN7o41i/+mL6jn4ZxxVg+bB9lIF12jGBQsTyR6eQdYFllDhhvbHQJmOwIFaKoFzmcxsqBW2eAf0rceomE6cTWRjyN0ruZvrVuOjhX2MyjZqU+gxaV05ZXKx/AfpYnD2pjXLhtw7oxsEpAbTrJDkEz8aAFW/25wWZY0MkseE1Ed2CKk74ydVzNLXwpwo7Qbt8N7hXJGCdtmwV1P1Xmv63libdiNrhLbq8ENUqQfmdtH/t9Ml4WrD1eyHH38XPUr0uuMZrNIZa6eNjuaD8r0EWDWfdSFMNj1FLzn5rmm7N7pUAMk4wABfGeGP2TlEsFa63S9KeG2KkFM5NyfH3A9tbGVgrk/hSybGyUeUB6/UVs7Q+TJj08h3J/RwjqWN35m1nb3NJlktwhtO/LzkJRuOKwskvWySAvAwqE1jZoWR/W+0mL5K4KDMkbTlK3zuLswBbnQdg3wsE9NnB+okpQJsNrFP3uATx8TZnt80UT36LJL2fUgLWg/yDmG26vaiptjgMyUKF9MKJCsm5LYJHzYbAVijDd6WT4k1JO97BSRYJVA+UEsFCIC1gD5B8BLnFH8ZIw0wG7Oyxbt0Xc2K+Isvq7PzNGy9+NcjKtP8yJWDXT3fP60Hdkih9/BuM3fksq9ZFAdiDkk8W+X83Qd+myR+TSZ6sYEtV8no5My831uGB20i3SUV5o/gYezEGsIeEwAahRffgCUkm2UES+mInzFyRvdCs8b9x8Agn3OXf3t1ALCAvWiJsP9npaw9dY1/W51Sbab33jHVDdLJ1ws7Ak9i/AIz4ikx7rvb+cRtY5a2HxHHZjBUyOtHvSuHe9QMkG8iBZx61flV00mXvz3vAVtJMqJU+3UXOlU6ewARH62PQd7qepIAuo98t60nLvEAXuK5+R/Ik5MajG9mNcp4s62g/2+hCpy95MkbJzQiH3Zxzq0mesxMKXETCZeI24X27iJZvp33B1/2/R9taFUhKYlk4UDfQMQkwh0GfSzOuT6+NH5z7vQKwSyLHYFUsLn+SseKmWwKpi6lsbhjiFMk543PXx1QGMeKLs5bk3jXVKEGDelABmp+lCo1T1wjQGcl194N6pvpNBFHi8cxRJZyEkhVF+iiMg/qyhxWgHZ3ydXcoXLMlZx1vHhO2Sp1pTJTlXzVqUgoDVvfnSAV4doM6p2HtFBdaa3N+A6y6Urq6tkFv8t+UQL+1TgNTKNBSLZQ8ovFvM6lFLk+gAaB9ElhfpWVz23nbGKIQZrlJU1K48LZJQDoB+jChZO7HXm4SefrAXiSB9SFSbk6DhqOA3YMHFD+wkQshrJVpL/BiAvsMSRjJx4pbH4mhveMswPoSugt5g5UP7CHhu1/6KFh4axVitGkJQ2vn5RXWbB/2P2QP2zLK8xrP1EeqlrY7aD1+iTtHoGJoa3LeQfWA7UL25sPf0dKgntPQovrh5kGKoOKGwFcwTHbWYGW9sapB/d8Bl/7ej/7HHa+DPooAKH5jdg9oo2tRzxqo+vi/hBg3EAaDGkHzQE+ANoG2Upg3g56h/9/XFNAw3GLVd04f+tCHPvShj0I6/gtjopxeR4k2EgAAAABJRU5ErkJggg==`\n\n\n### plug\\-in\n> fillColor=`#12ED12`\n\n\n#### com\\.igormaznitsa\\.jcp\n> fillColor=`#12ED12`\n\n\n##### task\n> fillColor=`#12ED12`\n\n\n###### preprocess\n\n####### sources\n> fillColor=`#FFFF00`\n\n\n######## sources = \\['src/main/java'\\]\n> fillColor=`#FFC800`\n\n\n####### eol\n> fillColor=`#FFFF00`\n\n\n######## eol = '\\\\r\\\\n'\n> fillColor=`#FFC800`\n\n\n####### keepAttributes\n> fillColor=`#FFFF00`\n\n\n######## keepAttributes=true\n> fillColor=`#FFC800`\n\n\n####### target\n> fillColor=`#FFFF00`\n\n\n######## target = file\\('build/preprocessed/java'\\)\n> fillColor=`#FFC800`\n\n\n####### sourceEncoding\n> fillColor=`#FFFF00`\n\n\n######## sourceEncoding='UTF\\-8'\n> fillColor=`#FFC800`\n\n\n####### targetEncoding\n> fillColor=`#FFFF00`\n\n\n######## targetEncoding='UTF\\-8'\n> fillColor=`#FFC800`\n\n\n####### ignoreMissingSources\n> fillColor=`#FFFF00`\n\n\n######## ignoreMissingSources=false\n> fillColor=`#FFC800`\n\n\n####### excludeExtensions\n> fillColor=`#FFFF00`\n\n\n######## excludeExtensions=\\['txt','xml'\\]\n> fillColor=`#FFC800`\n\n\n####### extensions\n> fillColor=`#FFFF00`\n\n\n######## extensions=\\['java'\\]\n> fillColor=`#FFC800`\n\n\n####### unknownVarAsFalse\n> fillColor=`#FFFF00`\n\n\n######## unknownVarAsFalse=false\n> fillColor=`#FFC800`\n\n\n####### dryRun\n> fillColor=`#FFFF00`\n\n\n######## dryRun=false\n> fillColor=`#FFC800`\n\n\n####### verbose\n> fillColor=`#FFFF00`\n\n\n######## verbose=true\n> fillColor=`#FFC800`\n\n\n####### clearTarget\n> fillColor=`#FFFF00`\n\n\n######## clearTarget=true\n> fillColor=`#FFC800`\n\n\n####### baseDir\n> fillColor=`#FFFF00`\n\n\n######## baseDir = file\\('build/someBase'\\)\n> fillColor=`#FFC800`\n\n\n####### careForLastEol\n> fillColor=`#FFFF00`\n\n\n######## careForLastEol=true\n> fillColor=`#FFC800`\n\n\n####### keepComments\n> fillColor=`#FFFF00`\n\n\n######## keepComments='keep\\_all'\n> fillColor=`#FFC800`\n\n\n####### vars\n> fillColor=`#FFFF00`\n\n\n######## vars = \\['someVar': 'Some Test Value'\\]\n> fillColor=`#FFC800`\n\n\n####### excludeFolders\n> fillColor=`#FFFF00`\n\n\n######## excludeFolders=\\['\\*\\*/some1','\\*\\*/some2'\\]\n> fillColor=`#FFC800`\n\n\n####### configFiles\n> fillColor=`#FFFF00`\n\n\n######## configFiles=\\['\\./configFile\\.txt'\\]\n> fillColor=`#FFC800`\n\n\n####### keepLines\n> fillColor=`#FFFF00`\n\n\n######## keepLines=true\n> fillColor=`#FFC800`\n\n\n####### allowWhitespaces\n> fillColor=`#FFFF00`\n\n\n######## allowWhitespaces=true\n> fillColor=`#FFC800`\n\n\n####### allowBlocks\n> fillColor=`#FFFF00`\n\n\n######## allowBlocks=true\n> fillColor=`#FFB600`\n\n\n####### preserveIndents\n> fillColor=`#FFFF00`\n\n\n######## preserveIndents=true\n> fillColor=`#FFC800`\n\n\n####### skip\n> fillColor=`#FFFF00`\n\n\n######## skip=true\n> fillColor=`#FFC800`\n\n\n####### dontOverwriteSameContent\n> fillColor=`#FFFF00`\n\n\n######## dontOverwriteSameContent=false\n> fillColor=`#FFC800`\n\n\n####### actionPreprocessorExtension\n> fillColor=`#FFFF00`\n\n\n######## actionPreprocessorExtension=\"com\\.igormaznitsa\\.jcp\\.extension\\.LogPreprocessorExtension\"\n> fillColor=`#FFB600`\n\n\n####### outcomingFiles\n> fillColor=`#00A4FF`\n\n\n######## read only\n> fillColor=`#FF71CC`\n\n\n######### set of files touched during preprocessing\n> fillColor=`#FFFF00`\n\n\n####### incomingFiles\n> fillColor=`#00A4FF`\n\n\n######## read only\n> fillColor=`#FF71CC`\n\n\n######### set of generated result files\n> fillColor=`#FFFF00`\n\n\n## External config files\n> fillColor=`#00B6FF`\n\n\n### multi\\-line text files\n> fillColor=`#00B6FF`\n\n\n#### line starts with\n> fillColor=`#00B6FF`\n\n\n##### /\n\n###### can contain CLi key\n> fillColor=`#49EFB6`\n\n\n####### /V\n\n##### \\#\n> leftSide=`true`\n\n\n###### recognized as comment\n> fillColor=`#49EFB6`\n\n\n####### \\# some ignored comment\n\n##### @\n\n###### throws preprocessor error\n> fillColor=`#49EFB6`\n\n\n####### @ error string\n\n##### any other non\\-empty\n\n###### interpret as global variable definition\n> fillColor=`#49EFB6`\n\n\n####### \\<VAR NAME\\>=\\<EXPRESSION\\>\n\n######## globalVar=\"Hello world\"\n> fillColor=`#FFC800`\n\n\n#### empty line\n> fillColor=`#00B6FF`\n\n\n##### ignored\n> fillColor=`#49EFB6`\n\n\n## Command Line\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n### /H,/h,/?,\\-H\\.\\-?\n> fillColor=`#00DBFF`\n\n\n#### print help information\n> fillColor=`#49EFB6`\n\n\n### /T:\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### set input encoding\n> fillColor=`#49EFB6`\n\n\n##### /T:UTF\\-8\n> fillColor=`#FFC800`\n\n\n### /TT:\n> fillColor=`#00DBFF`\n\n\n#### set output encoding\n> fillColor=`#49EFB6`\n\n\n##### /TT:UTF\\-8\n> fillColor=`#FFC800`\n\n\n### /C\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### clear target folder before preprocessing\n> fillColor=`#49EFB6`\n\n\n### /I:\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### define source folder for preprocessing\n> fillColor=`#49EFB6`\n\n\n##### /I:\\./src\n> fillColor=`#FFC800`\n\n\n### /O:\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### define result folder\n> fillColor=`#49EFB6`\n\n\n##### /O:\\./preprocess\n> fillColor=`#FFC800`\n\n\n### /F:\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### comma separated list of preprocessed extensions\n> fillColor=`#49EFB6`\n\n\n##### /F:java,txt,html\n> fillColor=`#FFC800`\n\n\n### /EF:\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### comma separated list of excluded extensions\n> fillColor=`#49EFB6`\n\n\n##### /EF:xml,png\n> fillColor=`#FFC800`\n\n\n### /EA:\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### preprocessor extension class name\n> fillColor=`#49EFB6`\n\n\n##### /EA:com\\.igormaznitsa\\.jcp\\.extension\\.LogPreprocessorExtension\n> fillColor=`#FFB600`\n\n\n### /ES\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### turn on support of white spaces betwee // and \\# in directives\n> fillColor=`#49EFB6`\n\n\n### /R\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### remove all Java like comments from result files\n> fillColor=`#49EFB6`\n\n\n### /K\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### prevent line numeration in result files\n> fillColor=`#49EFB6`\n\n\n### /Z\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### disable override result file if exists and has same content\n> fillColor=`#49EFB6`\n\n\n### /V\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### turn on verbose mode\n> fillColor=`#49EFB6`\n\n\n### @\\<file\\_name\\>\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### read global variables from a file\n> fillColor=`#49EFB6`\n\n\n### @@\\<expression\\>\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### read global variables from file which path defined by expression\n> fillColor=`#49EFB6`\n\n\n### /P:\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### define global variable value\n> fillColor=`#49EFB6`\n\n\n##### /P:DEBUG=true\n> fillColor=`#FFC800`\n\n\n### /N\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### carefully reproduce last EOL in result file\n> fillColor=`#49EFB6`\n\n\n### /PI\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### turn on indent preserving for //$ and //$$ directives\n> fillColor=`#49EFB6`\n\n\n### /ED:\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### folders to be excluded from preprocessing<br/>ANT matcher is allowed, system path separator as delimiter\n> fillColor=`#49EFB6`\n\n\n##### /ED:/\\*\\*/test:/\\*\\*/test\\*/some\n> fillColor=`#FFC800`\n\n\n### /A\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### keep original source attributes for result files\n> fillColor=`#49EFB6`\n\n\n### /U\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### turn on FALSE as unknown variable value\n> fillColor=`#49EFB6`\n\n\n### /B\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### Enable sulpport of multiline merging for //$ and //$$\n> fillColor=`#49EFB6`\n\n\n### /M:\n> fillColor=`#00DBFF`,leftSide=`true`\n\n\n#### allows select keep comment processor<br/>to remove selected kind of commented lines\n> fillColor=`#49EFB6`\n\n\n##### /M:remove\\_jcp\\_only\n> fillColor=`#FFC800`\n\n\n##### allowed values\n> fillColor=`#FFCC71`\n\n\n###### true\n> fillColor=`#FFCC71`\n\n\n####### same as keep\\_all\n> fillColor=`#49EFB6`,topicLinkUID=`18C52A4D054A`\n\n- TOPIC\n<pre>18C52A4EDD2A</pre>\n\n###### false\n> fillColor=`#FFCC71`\n\n\n####### same as remove\\_c\\_style\n> fillColor=`#49EFB6`\n\n- TOPIC\n<pre>18C52A5933DA</pre>\n\n###### keep\\_all\n> fillColor=`#FFCC71`,topicLinkUID=`18C52A4EDD2A`\n\n\n####### to not remove comments\n> fillColor=`#49EFB6`\n\n\n###### remove\\_c\\_style\n> fillColor=`#FFCC71`,topicLinkUID=`18C52A5933DA`\n\n\n####### remove all comments in C style\n> fillColor=`#49EFB6`\n\n\n###### remove\\_jcp\\_only\n> fillColor=`#FFCC71`\n\n\n####### remove only comment lines related to JCP\n> fillColor=`#49EFB6`\n\n\n## DSL\n> leftSide=`true`\n\n\n### Directives\n> fillColor=`#00FFFF`\n\n\n#### //\\#local \\<var name\\>=\\<expression\\>\n> fillColor=`#00FFFF`\n\n\n##### define local variable\n> fillColor=`#49EFB6`\n\n\n###### //\\#local somevar=\"Hello world\"\n> fillColor=`#FFC800`\n\n\n#### //\\#if \\<bool expression\\>\\.\\.//\\#else\\.\\.//\\#endif\n> fillColor=`#00FFFF`\n\n\n##### conditional execution<br/>needs boolean expression\n> fillColor=`#49EFB6`\n\n\n###### //\\#if boovar<br/>\\.\\.\\.<br/>//\\#else<br/>\\.\\.\\.<br/>//\\#endif\n> align=`left`,fillColor=`#FFC800`\n\n\n#### //\\#ifdefined \\<variable name\\>\\.\\.\\.//\\#else\\.\\.//\\#endif\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### conditional execution<br/>checks that a variable is defined\n> fillColor=`#49EFB6`\n\n\n###### //\\#ifdefined <br/>\\.\\.\\.<br/>//\\#else<br/>\\.\\.\\.<br/>//\\#endif\n> align=`left`,fillColor=`#FFC800`\n\n\n##### //\\#ifdef\\.\\.\\.//\\#else\\.\\.\\.//\\#endif\n> fillColor=`#FFDB00`\n\n\n#### //\\#ifndef \\<variable name\\>\\.\\.//\\#else\\.\\.//\\#endif\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### conditional execution<br/>checks that a variable is not defined\n> fillColor=`#49EFB6`\n\n\n###### //\\#ifndef  svar<br/>\\.\\.\\.<br/>//\\#else<br/>\\.\\.\\.<br/>//\\#endif\n> align=`left`,fillColor=`#FFC800`\n\n\n#### //\\#while \\<bool expression\\>\\.\\.//\\#break\\.\\.//\\#continue\\.\\.//\\#end\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### conditional execution<br/>while expression result is TRUE\n> fillColor=`#49EFB6`\n\n\n###### //\\#while a\\>0<br/>\\.\\.\\.<br/>//\\#break<br/>\\.\\.\\.<br/>//\\#continue<br/>\\.\\.\\.<br/>//\\#end\n> align=`left`,fillColor=`#FFC800`\n\n\n#### //\\#exitif \\<bool expression\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### conditional end of current file preprocessing<br/>return to calling file if presented\n> fillColor=`#49EFB6`\n\n\n###### //\\#exitif avar=\"hello\"\n> fillColor=`#FFC800`\n\n\n#### //\\#exit\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### end of current file preprocessing<br/>return to calling file if presented\n> fillColor=`#49EFB6`\n\n\n#### //\\#outdir \\<str expression\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### set output directory for preprocessing file\n> fillColor=`#49EFB6`\n\n\n###### //\\#outdir \"some/folder\"\n> fillColor=`#FFC800`\n\n\n#### //\\#\\[\\+|\\-\\]\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### turn on \\(\\+\\) and turn off \\(\\-\\) preprocessing\n> fillColor=`#49EFB6`\n\n\n###### preprocessed<br/>//\\#\\-<br/>non preprocessed<br/>//\\#\\+<br/>preprocessed\n> align=`left`,fillColor=`#FFC800`\n\n\n#### //\\#outname \\<str expression\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### set result name for preprocessing file\n> fillColor=`#49EFB6`\n\n\n###### //\\#outname \"some\\.java\"\n> fillColor=`#FFC800`\n\n\n#### //\\#//\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### comment next line\n> fillColor=`#49EFB6`\n\n\n###### //\\#//<br/>line to be commented\n> align=`left`,fillColor=`#FFC800`\n\n\n#### //\\#definel \\<var name\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### define a local boolean variable as TRUE\n> fillColor=`#49EFB6`\n\n\n###### //\\#definel newvar\n> fillColor=`#FFC800`\n\n\n#### //\\#define \\<var name\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### define a global boolean variable as TRUE\n> fillColor=`#49EFB6`\n\n\n###### //\\#define newglobal\n> fillColor=`#FFC800`\n\n\n#### //\\#undef \\<var name\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### remove variable if exists\n> fillColor=`#49EFB6`\n\n\n###### //\\#undef newvar\n> fillColor=`#FFC800`\n\n\n#### //\\#flush\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### force flushing of current buffer states to disk<br/>and clear internal buffers\n> fillColor=`#49EFB6`\n\n\n#### //\\#include \\<str expression\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### include preprocess result of defined file into position\n> fillColor=`#49EFB6`\n\n\n###### //\\#include \"some\\.java\"\n> fillColor=`#FFC800`\n\n\n#### //\\#action\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### make call to user extension<br/>with comma separated arguments\\.<br/>Its logic can be tuned through a preprocessor extennsion class \n> fillColor=`#49EFB6`\n\n\n###### //\\#action 1000,\"hello\",123\n> fillColor=`#FFC800`\n\n\n####### It requires a preprocessor extension\n> fillColor=`#FF3700`,mmd.emoticon=`error`,textColor=`#FFFFFF`\n\n\n#### //\\#postfix\\[\\+|\\-\\]\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### turn on \\(\\+\\) or turn off \\(\\-\\) output into postfix section\n> fillColor=`#49EFB6`\n\n\n###### some text<br/>//\\#postfix\\+<br/>it will be in the end<br/>//\\#postfix\\-<br/>other text\n> align=`left`,fillColor=`#FFC800`\n\n\n#### //\\#prefix\\[\\+|\\-\\]\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### turn on \\(\\+\\) or turn off \\(\\-\\) output into prefix section\n> fillColor=`#49EFB6`\n\n\n###### some text<br/>//\\#prefix\\+<br/>it will be in the beginning<br/>//\\#prefix\\-<br/>other text\n> align=`left`,fillColor=`#FFC800`\n\n\n#### //\\#global \\<var name\\>=\\<expression\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### define a global variable value\n> fillColor=`#49EFB6`\n\n\n###### //\\#global debug=true\n> fillColor=`#FFC800`\n\n\n#### //\\#\\_if\\.\\.//\\#\\_else\\.\\.//\\#\\_endif\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### special condition to be checked during 1st preprocessing pass<br/>works with global variables\n> fillColor=`#49EFB6`\n\n\n###### //\\#\\_if debug<br/>\\.\\.\\.<br/>//\\#\\_else<br/>\\.\\.\\.<br/>//\\#\\_endif\n> align=`left`,fillColor=`#FFC800`\n\n\n#### //\\#excludeif \\<bool expression\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### exclude file from preprocessing<br/>if boolean expression returns true\n> fillColor=`#49EFB6`\n\n\n###### //\\#excludeif debug\n> fillColor=`#FFC800`\n\n\n#### //\\#error \\<text\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### stop work and generate exception with notification<br/>macroses allowed\n> fillColor=`#49EFB6`\n\n\n###### //\\#error unexpected value /\\*$var1$\\*/\n> fillColor=`#FFC800`\n\n\n#### //\\#warning \\<text\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### log text as warning<br/>macroses allowed\n> fillColor=`#49EFB6`\n\n\n###### //\\#warning be careful with /\\*$var4$\\*/\n> fillColor=`#FFC800`\n\n\n#### //\\#echo \\<text\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### log text as info<br/>macroses allowed\n> fillColor=`#49EFB6`\n\n\n###### //\\#echo the line /\\*$\\_\\_line\\_\\_$\\*/\n> fillColor=`#FFC800`\n\n\n#### //\\#msg \\<text\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### log text as info<br/>macroses allowed, if verbose mode then stack will be printed\n> fillColor=`#49EFB6`\n\n\n###### //\\#msg some info\n> fillColor=`#FFC800`\n\n\n#### //\\#noautoflush\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### turn off autoflush for EOF\n> fillColor=`#49EFB6`\n\n\n#### //\\#abort \\<text\\>\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### abort preprocessing and show message<br/>macroses allowed\n> fillColor=`#49EFB6`\n\n\n###### //\\#abort thats all\\!\n> fillColor=`#FFC800`\n\n\n#### //$\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### remove comment and print result with macross processing\n> fillColor=`#49EFB6`\n\n\n###### //$ some line with /\\*$var$\\*/\n> fillColor=`#FFC800`\n\n\n####### Special case //$\"\"\" means merging of text lines<br/>before providing them to an external processor\n> fillColor=`#FFC800`\n\n\n#### //$$\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### remove comment and print result, macroses ignored\n> fillColor=`#49EFB6`\n\n\n###### //$$ some line with /\\*$nonprocessed macroses$\\*/\n> fillColor=`#FFC800`\n\n\n####### Special case //$$\"\"\" means merging of text lines<br/>before providing them to an external processor\n> fillColor=`#FFC800`\n\n\n#### /\\*\\-\\*/\n> fillColor=`#00FFFF`,leftSide=`true`\n\n\n##### drop tail of line\n> fillColor=`#49EFB6`\n\n\n###### some line/\\*\\-\\*/dropped part\n> fillColor=`#FFC800`\n\n\n### Data types\n> fillColor=`#FFC800`,leftSide=`true`\n\n\n#### boolean\n> fillColor=`#FFC800`\n\n\n##### true\n> fillColor=`#FFC800`\n\n\n##### false\n> fillColor=`#FFC800`,leftSide=`true`\n\n\n#### integer\n> fillColor=`#FFC800`,leftSide=`true`\n\n\n##### signed 64 bit\n\n###### 234567, 0x56FE\n> fillColor=`#FFC800`\n\n\n#### float\n> fillColor=`#FFC800`,leftSide=`true`\n\n\n##### signed 32 bit\n\n###### 0\\.745\n> fillColor=`#FFC800`\n\n\n#### string\n> fillColor=`#FFC800`,leftSide=`true`\n\n\n##### \"hello world\"\n> fillColor=`#FFC800`\n\n\n### Operators\n> fillColor=`#FFFF00`,leftSide=`true`\n\n\n#### ==, \\>, \\>=, \\<, \\<=, \\!= \n> fillColor=`#FFFF00`\n\n\n#### \\+,\\-,\\*,/,%\n> fillColor=`#FFFF00`,leftSide=`true`\n\n\n#### \\!, &&, ||, ^\n> fillColor=`#FFFF00`,leftSide=`true`\n\n\n### Functions\n> fillColor=`#FFC67D`,leftSide=`true`\n\n\n#### INT|FLOAT abs\\(INT|FLOAT\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n#### INT round\\(INT|FLOAT\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n#### BOOL is\\(STR,ANY\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n#### STR evalfile\\(STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n#### STR binfile\\(STR, STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n#### string processing\n> fillColor=`#FFCC71`\n\n\n##### BOOL issubstr\\(STR,STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### INT strlen\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### STR trimlines\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### STR esc\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### INT str2int\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### STR str2web\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### STR str2csv\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### STR str2js\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### STR str2json\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### STR str2xml\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### STR str2java\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### STR str2go\\(STR\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n#### xml functions\n> fillColor=`#FFCC71`,leftSide=`true`\n\n\n##### STR xml\\_get\\(STR, INT\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n##### INT xml\\_size\\(STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n##### STR xml\\_attr\\(STR, STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n##### STR xml\\_root\\(STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n##### STR xml\\_name\\(STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n##### STR xml\\_list\\(STR, STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n##### STR xml\\_text\\(STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n##### STR xml\\_open\\(STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n##### STR xml\\_xlist\\(STR, STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n##### STR xml\\_xelement\\(STR, STR\\)\n> fillColor=`#00B6FF`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n#### User defined functions\n> fillColor=`#FFC67D`,leftSide=`true`\n\n\n##### $\\<function\\_name\\>\\(\\.\\.\\.\\)\n> fillColor=`#00B6FF`,textColor=`#FFFFFF`\n\n\n###### It requires a preprocessor extension\n> fillColor=`#FF3700`,mmd.emoticon=`error`,textColor=`#FFFFFF`\n\n\n### special variables\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n#### jcp\\.version\n> fillColor=`#5BEBA4`\n\n\n##### preprocessor version\n\n##### read only\n> fillColor=`#FF0000`,textColor=`#FFFFFF`\n\n\n#### jcp\\.src\\.path\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n##### full path to preprocessing source file\n\n##### \\_\\_file\\_\\_\n\n##### read only\n> fillColor=`#FF0000`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n#### jcp\\.src\\.dir\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n##### Preprocessing file folder\n\n##### \\_\\_filefolder\\_\\_\n\n##### read only\n> fillColor=`#FF0000`,textColor=`#FFFFFF`\n\n\n#### jcp\\.src\\.name\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n##### Preprocessing file name\n\n##### \\_\\_filename\\_\\_\n\n##### read only\n> fillColor=`#FF0000`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n#### \\_\\_line\\_\\_\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n##### number of preprocessing line\n\n##### read only\n> fillColor=`#FF0000`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n#### jcp\\.dst\\.path\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n##### destination file path\n\n##### read only\n> fillColor=`#FF0000`,leftSide=`true`,textColor=`#FFFFFF`\n\n\n#### jcp\\.dst\\.dir\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n##### destination folder\n\n#### jcp\\.dst\\.name\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n##### destination file name\n\n#### \\_\\_time\\_\\_\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n##### current time<br/>HH:mm:ss\n\n#### \\_\\_date\\_\\_\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n##### current date<br/>MMM dd yyyy\n\n#### \\_\\_timestamp\\_\\_\n> fillColor=`#5BEBA4`,leftSide=`true`\n\n\n##### source file timestamp<br/>EEE MMM dd HH:mm:ss yyyy\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "![Logo](assets/banner.png)\n\n[![License Apache 2.0](https://img.shields.io/badge/license-Apache%20License%202.0-green.svg)](http://www.apache.org/licenses/LICENSE-2.0)\n[![Maven central](https://img.shields.io/badge/maven%20central-7.3.0-green.svg)](https://search.maven.org/#artifactdetails|com.igormaznitsa|jcp|7.3.0|jar)\n[![Java 11+](https://img.shields.io/badge/java-11%2b-green.svg)](http://www.oracle.com/technetwork/java/javase/downloads/index.html)\n[![Maven 3.0+](https://img.shields.io/badge/maven-3.0%2b-green.svg)](https://maven.apache.org/)\n[![Gradle 6.0+](https://img.shields.io/badge/gradle-6.0%2b-green.svg)](https://gradle.org/)\n[![Ant 1.8.2+](https://img.shields.io/badge/ant-1.8.2%2b-green.svg)](http://ant.apache.org/)   \n[![Arthur's acres sanctuary donation](assets/arthur_sanctuary_banner.png)](https://www.arthursacresanimalsanctuary.org/donate)\n\n# Changelog\n\n__7.3.0 (11-okt-2025)__\n\n- added way to manipulate current JCP text buffers as string variables: `jcp.text.buffer.all`,`jcp.text.buffer.middle`,\n  `jcp.text.buffer.prefix` and `jcp.text.buffer.postfix`\n- added way to find `PreprocessorExtension` and `SpecialVariableProcessor` among Java services\n- refactoring of API for `SpecialVariableProcessor` and `CommentTextProcessor`\n- replaced single string property `actionPreprocessorExtension` by string list `actionPreprocessorExtensions` to provide\n  way for many preprocessor extensions.\n- internal refactoring mainly to provide way for multiple external services implementing extensions\n\n__7.2.1 (21-jul-2025)__\n\n- refactoring of CommentTextProcessor call\n- refactoring\n\n[Full changelog](https://github.com/raydac/java-comment-preprocessor/blob/master/changelog.txt)\n\n# Introduction\n\nOriginally developed in 2002, the preprocessor tool emerged from the need to manage diverse sources for J2ME devices efficiently. It aimed to streamline altering specific calls' positions across different devices, optimizing the development process. With Java as the primary technology, the tool was fine-tuned for C/Java family languages, capitalizing on their import sections and C-comment style.\n\nInitially a closed project, it transitioned to an open-source initiative in 2011. Today, it stands out as a potent two-pass Java preprocessor, adept at understanding document structure (prefix, body, and postfix), incorporating loops, and utilizing XML files as data sources. Its capabilities extend to generating static websites.\n\nThe preprocessor now exists as a comprehensive uber-jar bundled with interface code for Maven, ANT, and Gradle, seamlessly integrating with these tools. It requires a minimum JDK of version 1.8.\n\nMoreover, various Linux repositories offer the preprocessor as a package, commonly named `libcomment-preprocessor-java`, simplifying its accessibility for users.\n\n\n# Mind map with all options\n\n![Mind map of preprocessor options](assets/documap.png)\n\n# How to use\n\nThe Preprocessor can work as:\n  - CLI tool\n  - Java JAR-library\n  - [Maven goal](jcp-tests/jcp-test-maven) [_(generated Maven mojo site)_](https://raydac.github.io/jcp-maven-plugin-site/index.html)\n  - [ANT task](jcp-tests/jcp-test-ant)\n  - [Gradle task](jcp-tests/jcp-test-gradle)\n\nThe preprocessor has been published in [the Maven Central](https://search.maven.org/artifact/com.igormaznitsa/jcp).\n```\n    <build>\n        <plugins>\n...\n           <plugin>\n                <groupId>com.igormaznitsa</groupId>\n                <artifactId>jcp</artifactId>\n                <version>7.3.0</version>\n                <executions>\n                    <execution>\n                        <id>preprocessSources</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>preprocess</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n...\n        </plugins>\n    </build>    \n```\n\n# How to use from command line\nThe uber-jar can be started directly under Java through CLI interface. Let's take a look at short example below how to start it in command line under Linux:\n```\njava -jar jcp-7.3.0.jar  --i:./test --o:./result\n```\nThe example above just preprocessing files from ./test folder (which extensions allowed to be preprocessed by default), and placing result files into ./result folder. Keep in your mind that the preprocessor processing not all files, for instance XML files will not be preprocessed by default. Files which extension not marked for preprocessing will be just copied (of course if the extensions is not in the excluded extension list)\n\nMore complex example:\n```\njava -jar jcp-7.3.0.jar  --c --r --v --f:java,xml --ef:none --i:./test --o:./result  '--p:HelloWorld=$Hello world$'\n```\n- --c clear the destination folder before work\n- --r remove all Java-style comments from preprocessed result files\n- --v show verbose log about preprocessing process\n- --f include .java and .xml files into preprocessing (by default the preprocessor doesn't preprocess XNL files and the extension should to be defined explicitly)\n- --ef don't exclude any extension from preprocessing\n- --i use ./test as source folder\n- --o use ./result as destination folder\n- --p define named global variable HelloWorld? with the 'Hello world' content\n- --z turn on checking of file content before replacement, if the same content then preprocessor will not replace the file  \n- --es allow whitespace between comment and directive (by default it is turned off)\n\n# Some examples\n- [Prepare sources for Javassist](jcp-tests/jcp-test-javassist)\n- [Make multi-versioned JAR  for JEP-238](jcp-tests/jcp-test-jep238)\n- [Generate static file from XML sources](jcp-tests/jcp-test-static-site)\n- [Simple Android Gradle-based project](jcp-tests/jcp-test-android)\n\n# Example of Java sources with directives\nIn Java the only allowed way to inject directives and to not break work of tools and compilers - is to use commented space, so that the preprocessor uses it.\n```Java\n//#local TESTVAR=\"TEST LOCAL VARIABLE\"\n//#echo TESTVAR=/*$TESTVAR$*/\n//#include \"./test/_MainProcedure.java\"\n\npublic static final void testproc()\n{\n System.out.println(/*$VARHELLO$*/);\n System.out.println(\"// Hello commentaries\");\n //#local counter=10\n        //#while counter!=0\n        System.out.println(\"Number /*$counter$*/\");\n        //#local counter=counter-1\n        //#end\n System.out.println(\"Current file name is /*$SRV_CUR_FILE$*/\");\n System.out.println(\"Output dir is /*$SRV_OUT_DIR$*/\");\n //#if issubstr(\"Hello\",\"Hello world\")\n System.out.println(\"Substring found\");\n //#endif\n}\n```\n\n# Multi-sectioned documents\nIn opposite a regular document, a Java document has as minimum two sections - prefix (where situated import and special information) and body. For access to such sections there are special preprocessing directives `//#prefix[-|+]`, `//#postfix[-|+]`. They allow turning on or off output into prefix and postfix sections.\n```Java\n//#prefix+\n import java.lang.*;\n //#prefix-\n public class Main {\n  //#prefix+\n  import java.util.*;\n  //#prefix-\n  public static void main(String ... args){}\n }\n```\n# How to remove all comments from sources\nSometimes it is very useful to remove totally all comments from sources, such possibility included into JCP and can be activated with either a special flag or command line switcher. The example below shows how to remove all comments with CLI use:\n```\njava -jar ./jcp-7.3.0.jar --i:/sourceFolder --o:/resultFolder -ef:none --r\n``` \n\n"
  },
  {
    "path": "changelog.txt",
    "content": "__7.3.0 (11-okt-2025)__\n\n- added way to manipulate current JCP text buffers as string variables: `jcp.text.buffer.all`,`jcp.text.buffer.middle`,`jcp.text.buffer.prefix` and `jcp.text.buffer.postfix`\n- added way to find `PreprocessorExtension` and `SpecialVariableProcessor` among Java services\n- refactoring of API for `SpecialVariableProcessor` and `CommentTextProcessor`\n- replaced single string property `actionPreprocessorExtension` by string list `actionPreprocessorExtensions` to provide way for many preprocessor extensions.\n- internal refactoring mainly to provide way for multiple external services implementing extensions\n\n__7.2.1 (21-jul-2025)__\n\n- refactoring of CommentTextProcessor call\n- refactoring\n\n__7.2.0 (13-jul-2025)__\n\n- minimum JDK version 11\n- added support for external processors calls during uncommenting actions `//$` and `//$$`, processors can be provided as services\n- removed support of Gradle 5\n- updated dependencies\n\n__7.1.2 (08-jun-2024)__\n\n- added way to define a preprocessor extension class through CLI (as `/EA:<class.name>`) and in plugins (as `actionPreprocessorExtension`). The class should be provided in the clas path.[#48](https://github.com/raydac/java-comment-preprocessor/issues/48)\n- updated some dependencies\n\n__7.1.1 (13-jan-2024)__\n\n- fixed NPE for empty or null global variable value in Maven and Gradle [#47](https://github.com/raydac/java-comment-preprocessor/issues/47)\n- updated dependencies\n\n__7.1.0 (10-dec-2023)__\n\n- refactoring of internal API\n- updated dependencies\n- improved keep comments processing, added `/M:<type>` CLI option [#46](https://github.com/raydac/java-comment-preprocessor/issues/46)\n\n__7.0.5 (11-dec-2021)__\n\n - fixed compatibility with Gradle 7.x\n - added support of build under JDK 16\n - updated dependencies\n\n7.0.4 (26-sep-2020)\n - fixed default flag state `keep comments` for start in CLI mode [#24](https://github.com/raydac/java-comment-preprocessor/issues/24)\n - fixed working directory detection in CLI mode\n\n7.0.3 (13-sep-2020)\n - added way to get info about all input and produced files from preprocessor context\n - reworked Gradle plug-in, removed extension and now properties should be directly provided for task [#21](https://github.com/raydac/java-comment-preprocessor/issues/21)\n - refactoring, removed some auxiliary plugins from build process and extra code\n\n7.0.2 (15-jul-2019)\n - fixed leaks of system scoped dependencies in generated pom.xml\n\n7.0.1 (19-apr-2019)\n - minor refactoring\n\n7.0.0 (31-mar-2019)\n - reworked some parameters for Maven and ANT plug-ins\n - added embedded Gradle plugin `com.igormaznitsa.jcp`\n - removed maven `clear` goal\n - removed maven `preprocessTest` goal (use flag `useTestSources` instead)\n - added function `STR esc(STR)`\n - fixed build under JDK 9+\n - XML functions work through embedded [Apache Xalan](https://xalan.apache.org/) and [Apache Xerces](http://xerces.apache.org/)\n - minimal needed Java version changed to 1.8\n - refactoring\n\n6.1.4 (16-jun-2018)\n - removed dependencies to meta packages (their sources moved into project) #19\n\n6.1.3 (29-apr-2018)\n - added automatic module name `igormaznitsa.jcp`\n - CORE: added `/U` key to turn on mode to interpret unknown variables as FALSE (in Maven and ANT `unknownVarAsFalse`), [#17](https://github.com/raydac/java-comment-preprocessor/issues/17)\n\n6.1.2 (02-apr-2017)\n - CORE: added STR TRIMLINES(STR) function to trim lines represented as string and removing empty lines\n - CORE: added `/A` command line option (`copyFileAttributes` in Maven and ANT) to copy file attributes\n - CORE: added `/ED:` command line option to exclude sub-folders from preprocessing (`excludedFolders` in Maven and ANT) with ANT pattern support.\n - CORE: added `/PI` command line flag (`preserveIndent` in Maven and ANT), turn on mode to preserve indent when removing `//$` and `//$$`, thanks to @jamuir\n - CORE: comma in split lines in BINFILE function moved from the start of line to the end of the previous line (to increase compatibility with Go)\n\n6.1.1 (11-feb-2017)\n - MAVEN: information about imported maven properties will be shown only in either verbose mode or debug mode\n - MAVEN: added auxiliary goal `preprocessTests` which provides flag `useTestSources` as true and activated by default in GENERATE_TEST_SOURCES phase #14\n - MAVEN: added 'ignoreMissingSources' boolean parameter, allows to skip preprocessing if source folders not found or not provided #12\n - MAVEN: added 'skip'boolean parameter, it allows to skip execution, also it is possible to use `-Djcp.preprocess.skip=true` #13\n -  CORE: added function `BOOL is(STR,ANY)` to check existence of variable for its name and compare its value with etalon (through string conversion, it will ensure true for `true` and `\"true\"` case), #10\n -  CORE: added `STR str2go(STR)` function to escape strings to be represented in Golang sources\n -  CORE: improved the BINFILE function, it allows `base64|byte[]|uint8[]|int8` and modifiers `s|d|ds|sd` where s - means splitting to lines and d - means deflate compression\n\n6.1.0 (03-jul-2016)\n- implemented request #9, added support of whitespace between directive and comment, in command line it is `--es` option and in MAVEN and ANT it is boolean parameter `allowWhitespace`, by default it is turned off\n- added function STR binfile(STR,STR) to load a bin file as encoded base64 or java byte array string\n- changes in Preprocessor API, removed usage of null instead of PreprocessorContext or PreprocessingState as argument for many methods, improved tests\n- fixed #8 issue, fixed work with absolute paths in //#include and evalfile(), added tests\n- refactoring\n\n6.0.1\n- improved the MAVEN plugin to hide content of potentially sensitive properties from printing into Maven log (issue #2)\n- added --z option ('compareDestination' in MAVEN and ANT) to check content of existing result file and to not replace it if content equals (issue #1), by default turned off because makes some overhead\n- fixed --c argument usage in CLI, now by default the preprocessor started in CLI doesn't clear its output folder, use --c to turn it on\n- improved tests\n- minor bug-fixing\n\n6.0.0\n- bugfixing and log improvement\n- RENAMED DIRECTIVE! //#assert renamed to appropriate name //#echo\n- RENAMED FUNCTIONS! renamed XML functions to more appropriate and short names\n- xml_getRoot to xml_root\n- xml_elementAt to xml_get\n- xml_elementsNumber to xml_size\n- xml_getAttribute to xml_attr\n- xml_getElementName to xml_name\n- xml_getElementsForName to xml_list\n- xml_getElementText to xml_text\n- fixed //#exit and //#exitif behavior to prevent total exit and return level up in include stack\n- added //#abort directive to provide possibility to stop preprocessing immediately without errors\n- added function 'STR evalfile(STR)' for local preprocessing of a file body and return it as a string\n- added predefined variables 'line','filename','filefolder' and 'file' which allow to get name and path parameters for the current preprocessing file path\n- added predefined variables 'time','date' and 'timestamp' which work similar C++ predefined macroses\n- added function 'STR str2java(STR,BOOL)' to escape and split string to be presented as java sources\n- added functions 'STR str2js(STR)', 'STR str2json(STR)','STR str2xml(STR)' and 'STR str2csv(STR)'\n- added functions 'STR xml_xlist(STR,STR)' and 'STR xml_xelement(STR,STR)' which allow to use xpath to get element lists an elements\n- apache common-io and common-lang libraries have been packed into the jar and hidden\n- added the short variant '//#ifdef BOOL' for '//#ifdefined BOOL'\n- added '//#ifndef BOOL' to check that a variable is undefined\n- added '//#definel NAME' and '//#define NAME' to define local and global variables, they can use not only the default TRUE value for defined variables, but also result of expression (example: //#define ten 2*5)\n- added '//#undef NAME' to remove a variable definition from context\n- added '//#error EXPR' and '//#warning EXPR' directives to throw exception and log warnings\n- added support of custom line separator through the 'jcp.line.separator' system property\n- added '//#noautoflush' to prevent auto saving text buffers after file preprocessing\n\n5.3.4\n- added support of test source folder preprocessing for maven projects\n- added the \"clear\" maven goal to clear created preprocessing folders or any defined folders and files\n- by default the maven plugin trying to keep numeration of lines in preprocessed files (the 'keepLines' is true by default)\n\n5.3.3\n- fixed the bug in the comment removing (multiple stars before closing slash)\n- fixed the exception if there is not any organization tag in a project pom.xml\n- added support for '-' and '--' prefixes in CLI arguments\n- improved CLI argument error messaging\n- the license has been changed to Apache 2.0\n\n5.3.2\n- very minor refactoring.\n- fixed issue (ID 5) \"Removing strings contain only spaces\"\n- the first version published in the maven central\n\n5.3.1\n- very minor bug-fixing, added the main-class attribute in the preprocessor JAR Manifest \n\n5.3\n- Added feature to keep non-executing lines as commented ones (/k command line key), all non-executing lines will be saved in the output as commented ones\n\n5.2\n- Fixed issue (ID 3). The default charset was used to read text files.\n\n5.1\n- Fixed issue (ID 1). Inaccessible functionality both \"load a file with global variables\" and \"define global variable\" through a command line call. \n\n5.0 \n- The initial published version of totally reworked preprocessor\n"
  },
  {
    "path": "jcp/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>com.igormaznitsa</groupId>\n        <artifactId>jcp-pom</artifactId>\n        <version>7.3.0</version>\n    </parent>\n\n    <artifactId>jcp</artifactId>\n    <packaging>maven-plugin</packaging>\n\n    <name>Java Comment Preprocessor</name>\n    <description>Powerful multi-pass preprocessor to process directives situated in C-styled commentaries</description>\n\n    <repositories>\n        <repository>\n            <id>gradle-releases-repository</id>\n            <url>https://repo.gradle.org/gradle/libs-releases-local/</url>\n        </repository>\n    </repositories>\n\n    <properties>\n        <gradle.api.version>6.0</gradle.api.version>\n    </properties>\n\n    <profiles>\n        <profile>\n            <id>site</id>\n            <properties>\n                <mojo.site.dir>${project.basedir}/../mojo-doc-site</mojo.site.dir>\n            </properties>\n            <reporting>\n                <plugins>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-plugin-report-plugin</artifactId>\n                    </plugin>\n                </plugins>\n            </reporting>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-clean-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <id>delete-project-site</id>\n                                <goals>\n                                    <goal>clean</goal>\n                                </goals>\n                                <phase>clean</phase>\n                                <configuration>\n                                    <excludeDefaultDirectories>true</excludeDefaultDirectories>\n                                    <failOnError>true</failOnError>\n                                    <filesets>\n                                        <fileset>\n                                            <directory>${mojo.site.dir}</directory>\n                                        </fileset>\n                                    </filesets>\n                                </configuration>\n                            </execution>\n                        </executions>\n                    </plugin>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-site-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <id>generate-project-site</id>\n                                <goals>\n                                    <goal>site</goal>\n                                </goals>\n                                <phase>verify</phase>\n                                <configuration>\n                                    <outputDirectory>${mojo.site.dir}</outputDirectory>\n                                </configuration>\n                            </execution>\n                        </executions>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>\n        <profile>\n            <id>publish</id>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-assembly-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <id>make-bundle</id>\n                                <phase>install</phase>\n                                <goals>\n                                    <goal>single</goal>\n                                </goals>\n                                <configuration>\n                                    <descriptors>\n                                        <descriptor>src/assemble/bundle.xml</descriptor>\n                                    </descriptors>\n                                </configuration>\n                            </execution>\n                        </executions>\n                    </plugin>\n\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-javadoc-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <id>generate-javadoc</id>\n                                <phase>package</phase>\n                                <goals>\n                                    <goal>jar</goal>\n                                </goals>\n                                <configuration>\n                                    <!--<failOnError>false</failOnError>-->\n                                    <source>${maven.compiler.release}</source>\n                                    <legacyMode>true</legacyMode>\n                                    <failOnError>false</failOnError>\n                                    <sourceFileExcludes>\n                                        <exclude>**/HelpMojo.java</exclude>\n                                    </sourceFileExcludes>\n                                </configuration>\n                            </execution>\n                        </executions>\n                    </plugin>\n\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-source-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <id>generate-sources</id>\n                                <phase>package</phase>\n                                <goals>\n                                    <goal>jar</goal>\n                                </goals>\n                            </execution>\n                        </executions>\n                    </plugin>\n\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-gpg-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <id>sign-artifacts</id>\n                                <phase>verify</phase>\n                                <goals>\n                                    <goal>sign</goal>\n                                </goals>\n                            </execution>\n                        </executions>\n                    </plugin>\n\n                    <plugin>\n                        <groupId>net.nicoulaj.maven.plugins</groupId>\n                        <artifactId>checksum-maven-plugin</artifactId>\n                        <version>1.11</version>\n                        <executions>\n                            <execution>\n                                <phase>verify</phase>\n                                <goals>\n                                    <goal>files</goal>\n                                </goals>\n                                <configuration>\n                                    <fileSets>\n                                        <fileSet>\n                                            <directory>${project.build.directory}</directory>\n                                            <includes>\n                                                <include>*.jar</include>\n                                                <include>*.pom</include>\n                                            </includes>\n                                        </fileSet>\n                                    </fileSets>\n                                    <algorithms>\n                                        <algorithm>SHA-1</algorithm>\n                                        <algorithm>MD5</algorithm>\n                                    </algorithms>\n                                </configuration>\n                            </execution>\n                        </executions>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>\n    </profiles>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.apache.ant</groupId>\n            <artifactId>ant</artifactId>\n            <version>1.10.15</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven.plugin-tools</groupId>\n            <artifactId>maven-plugin-annotations</artifactId>\n            <version>${min.maven.api}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-plugin-api</artifactId>\n            <version>${min.maven.api}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-core</artifactId>\n            <version>${min.maven.api}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven.shared</groupId>\n            <artifactId>file-management</artifactId>\n            <version>3.2.0</version>\n            <scope>provided</scope>\n            <exclusions>\n                <exclusion>\n                    <groupId>commons-io</groupId>\n                    <artifactId>commons-io</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>commons-io</groupId>\n            <artifactId>commons-io</artifactId>\n            <version>2.19.0</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-text</artifactId>\n            <version>1.14.0</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-codec</groupId>\n            <artifactId>commons-codec</artifactId>\n            <version>1.19.0</version>\n        </dependency>\n        <dependency>\n            <groupId>xerces</groupId>\n            <artifactId>xercesImpl</artifactId>\n            <version>2.12.2</version>\n        </dependency>\n        <dependency>\n            <groupId>xalan</groupId>\n            <artifactId>xalan</artifactId>\n            <version>2.7.3</version>\n        </dependency>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.18.38</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.vintage</groupId>\n            <artifactId>junit-vintage-engine</artifactId>\n            <version>${junit.version}</version>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-compat</artifactId>\n            <version>${min.maven.api}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-artifact</artifactId>\n            <version>${min.maven.api}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-artifact-manager</artifactId>\n            <version>2.2.1</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven.plugin-testing</groupId>\n            <artifactId>maven-plugin-testing-harness</artifactId>\n            <version>2.1</version>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.powermock</groupId>\n            <artifactId>powermock-module-junit4</artifactId>\n            <version>2.0.9</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.powermock</groupId>\n            <artifactId>powermock-api-mockito2</artifactId>\n            <version>2.0.9</version>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.gradle</groupId>\n            <artifactId>gradle-core</artifactId>\n            <version>${gradle.api.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.gradle</groupId>\n            <artifactId>gradle-core-api</artifactId>\n            <version>${gradle.api.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.gradle</groupId>\n            <artifactId>gradle-model-core</artifactId>\n            <version>${gradle.api.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.gradle</groupId>\n            <artifactId>gradle-logging</artifactId>\n            <version>${gradle.api.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.gradle</groupId>\n            <artifactId>gradle-base-services</artifactId>\n            <version>${gradle.api.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.gradle</groupId>\n            <artifactId>gradle-base-services-groovy</artifactId>\n            <version>${gradle.api.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.gradle</groupId>\n            <artifactId>gradle-plugins</artifactId>\n            <version>${gradle.api.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.gradle</groupId>\n            <artifactId>gradle-tooling-api</artifactId>\n            <version>${gradle.api.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.codehaus.groovy</groupId>\n            <artifactId>groovy</artifactId>\n            <version>2.5.14</version>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <resources>\n            <resource>\n                <directory>src/main/resources</directory>\n                <filtering>false</filtering>\n                <excludes>\n                    <exclude>/jcpversion.properties</exclude>\n                </excludes>\n            </resource>\n            <resource>\n                <directory>src/main/resources</directory>\n                <filtering>true</filtering>\n                <includes>\n                    <include>**/jcpversion.properties</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-enforcer-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>jcp-check-enforce-rules</id>\n                        <configuration>\n                            <rules>\n                                <banDuplicatePomDependencyVersions/>\n                                <enforceBytecodeVersion>\n                                    <maxJdkVersion>${maven.compiler.release}</maxJdkVersion>\n                                    <ignoredScopes>\n                                        <scope>test</scope>\n                                        <scope>provided</scope>\n                                    </ignoredScopes>\n                                </enforceBytecodeVersion>\n                                <banCircularDependencies>\n                                    <ignoredScopes>\n                                        <scope>test</scope>\n                                        <scope>provided</scope>\n                                    </ignoredScopes>\n                                </banCircularDependencies>\n                                <reactorModuleConvergence>\n                                    <ignoreModuleDependencies>true</ignoreModuleDependencies>\n                                </reactorModuleConvergence>\n                                <requireJavaVersion>\n                                    <version>[${maven.compiler.release},)</version>\n                                </requireJavaVersion>\n                                <requireMavenVersion>\n                                    <version>[${min.maven.api},)</version>\n                                </requireMavenVersion>\n                                <banDuplicateClasses>\n                                    <scopes>\n                                        <scope>compile</scope>\n                                    </scopes>\n                                    <findAllDuplicates>true</findAllDuplicates>\n                                    <ignoreWhenIdentical>true</ignoreWhenIdentical>\n                                </banDuplicateClasses>\n                            </rules>\n                        </configuration>\n                        <goals>\n                            <goal>enforce</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.codehaus.mojo</groupId>\n                        <artifactId>extra-enforcer-rules</artifactId>\n                        <version>1.10.0</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n\n            <plugin>\n                <groupId>com.igormaznitsa</groupId>\n                <artifactId>uber-pom</artifactId>\n                <version>1.0.3</version>\n                <configuration>\n                    <removeDependencies>\n                        <dependency>\n                            <systemPath>*</systemPath>\n                        </dependency>\n                    </removeDependencies>\n                    <remove>\n                        <section>parent</section>\n                        <section>modules</section>\n                        <section>profiles/profile/modules</section>\n                    </remove>\n                    <removeSiblingDuplications>true</removeSiblingDuplications>\n                </configuration>\n                <executions>\n                    <execution>\n                        <phase>package</phase>\n                        <goals>\n                            <goal>upom</goal>\n                        </goals>\n                        <configuration>\n                            <enforceInjecting>true</enforceInjecting>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n\n            <plugin>\n                <groupId>org.projectlombok</groupId>\n                <artifactId>lombok-maven-plugin</artifactId>\n                <version>1.18.20.0</version>\n                <executions>\n                    <execution>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>delombok</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-plugin-plugin</artifactId>\n                <configuration>\n                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>mojo-descriptor</id>\n                        <goals>\n                            <goal>descriptor</goal>\n                        </goals>\n                    </execution>\n                    <execution>\n                        <id>help-goal</id>\n                        <goals>\n                            <goal>helpmojo</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-shade-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <phase>package</phase>\n                        <goals>\n                            <goal>shade</goal>\n                        </goals>\n                        <configuration>\n                            <relocations>\n                                <relocation>\n                                    <pattern>javax.xml</pattern>\n                                    <shadedPattern>hidden.jcp.javax.xml</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.apache.commons</pattern>\n                                    <shadedPattern>hidden.jcp.org.apache.commons</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>license</pattern>\n                                    <shadedPattern>hidden.jcp.license</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.xml</pattern>\n                                    <shadedPattern>hidden.jcp.org.xml</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.apache.xpath</pattern>\n                                    <shadedPattern>hidden.jcp.org.apache.xpath</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.apache.xml</pattern>\n                                    <shadedPattern>hidden.jcp.org.apache.xml</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.apache.wml</pattern>\n                                    <shadedPattern>hidden.jcp.org.apache.wml</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.apache.regexp</pattern>\n                                    <shadedPattern>hidden.jcp.org.apache.regexp</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.apache.html</pattern>\n                                    <shadedPattern>hidden.jcp.org.apache.html</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.apache.bcel</pattern>\n                                    <shadedPattern>hidden.jcp.org.apache.bcel</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.apache.xerces</pattern>\n                                    <shadedPattern>hidden.jcp.org.apache.xerces</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.apache.xalan</pattern>\n                                    <shadedPattern>hidden.jcp.org.apache.xalan</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.w3c</pattern>\n                                    <shadedPattern>hidden.jcp.org.w3c</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>java_cup</pattern>\n                                    <shadedPattern>hidden.jcp.java_cup</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>trax</pattern>\n                                    <shadedPattern>hidden.jcp.trax</shadedPattern>\n                                </relocation>\n                                <relocation>\n                                    <pattern>org.springframework</pattern>\n                                    <shadedPattern>hidden.jcp.org.springframework</shadedPattern>\n                                </relocation>\n                            </relocations>\n                            <artifactSet>\n                                <includes>\n                                    <include>org.springframework:*</include>\n                                    <include>commons-io:*</include>\n                                    <include>commons-codec:*</include>\n                                    <include>commons-text:*</include>\n                                    <include>org.apache.commons:*</include>\n                                    <include>xerces:*</include>\n                                    <include>xalan:*</include>\n                                    <include>com.igormaznitsa:*</include>\n                                    <include>xml-apis:*</include>\n                                </includes>\n                            </artifactSet>\n                            <filters>\n                                <filter>\n                                    <artifact>*:*</artifact>\n                                    <excludes>\n                                        <exclude>META-INF/LICENSE.txt</exclude>\n                                        <exclude>META-INF/NOTICE.txt</exclude>\n                                        <exclude>META-INF/MANIFEST.MF</exclude>\n                                        <exclude>META-INF/MANIFEST.txt</exclude>\n                                        <exclude>META-INF/*.SF</exclude>\n                                        <exclude>META-INF/*.DSA</exclude>\n                                        <exclude>META-INF/*.RSA</exclude>\n                                        <exclude>META-INF/services/javax.xml.*</exclude>\n                                        <exclude>META-INF/services/org.apache.*</exclude>\n                                        <exclude>META-INF/services/org.w3c.*</exclude>\n                                        <exclude>META-INF/services/org.xml.*</exclude>\n                                        <exclude>META-INF/versions/9/module-info.class</exclude>\n                                    </excludes>\n                                </filter>\n                            </filters>\n                            <transformers>\n                                <transformer\n                                        implementation=\"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer\">\n                                    <mainClass>com.igormaznitsa.jcp.JcpPreprocessor</mainClass>\n                                </transformer>\n                            </transformers>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <configuration>\n                    <archive>\n                        <manifest>\n                            <mainClass>com.igormaznitsa.jcp.JcpPreprocessor</mainClass>\n                        </manifest>\n                        <manifestEntries>\n                            <Automatic-Module-Name>igormaznitsa.jcp</Automatic-Module-Name>\n                        </manifestEntries>\n                    </archive>\n                </configuration>\n            </plugin>\n\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <configuration>\n                    <compilerArgument>-Xlint:all</compilerArgument>\n                    <showDeprecation>true</showDeprecation>\n                    <showWarnings>true</showWarnings>\n                    <release>${maven.compiler.release}</release>\n                    <excludes>\n                        <exclude>\n                            **${file.separator}JCPreprocessor${file.separator}src${file.separator}test${file.separator}resources${file.separator}com${file.separator}igormaznitsa${file.separator}jcp${file.separator}it${file.separator}maven${file.separator}dummy_maven_project${file.separator}**${file.separator}*.java\n                        </exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <configuration>\n                    <systemPropertyVariables>\n                        <test.folder>${project.build.testOutputDirectory}</test.folder>\n                    </systemPropertyVariables>\n                </configuration>\n            </plugin>\n\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "jcp/src/assemble/bundle.xml",
    "content": "<assembly xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n          xmlns=\"http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2\"\n          xsi:schemaLocation=\"http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd\">\n    <id>bundle</id>\n\n    <includeBaseDirectory>false</includeBaseDirectory>\n    <includeSiteDirectory>false</includeSiteDirectory>\n\n    <formats>\n        <format>tar.gz</format>\n    </formats>\n    <fileSets>\n        <fileSet>\n            <directory>${project.build.directory}</directory>\n            <outputDirectory>/com/igormaznitsa/${project.artifactId}/${project.version}</outputDirectory>\n            <includes>\n                <include>*.jar</include>\n                <include>*.jar.asc</include>\n                <include>*.jar.sha1</include>\n                <include>*.jar.md5</include>\n                <include>*.pom</include>\n                <include>*.pom.asc</include>\n                <include>*.pom.sha1</include>\n                <include>*.pom.md5</include>\n            </includes>\n            <excludes>\n                <exclude>original*.*</exclude>\n                <exclude>*.zip</exclude>\n            </excludes>\n        </fileSet>\n    </fileSets>\n</assembly>"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/InfoHelper.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp;\n\nimport static com.igormaznitsa.jcp.context.JCPSpecialVariableProcessor.getReference;\nimport static java.util.Objects.requireNonNull;\nimport static java.util.stream.Collectors.toList;\n\nimport com.igormaznitsa.jcp.cmdline.CommandLineHandler;\nimport com.igormaznitsa.jcp.context.JCPSpecialVariableProcessor;\nimport com.igormaznitsa.jcp.directives.AbstractDirectiveHandler;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.expression.functions.AbstractFunction;\nimport com.igormaznitsa.jcp.expression.operators.AbstractOperator;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Properties;\n\npublic final class InfoHelper {\n\n  public static final String DELIMITER = \"-------------------------------------------------\";\n  public static final String SHORT_DELIMITER = \"----------------------\";\n\n  public static final String VERSION;\n  public static final String URL;\n  public static final int YEAR;\n\n  static {\n    final String path = \"/jcpversion.properties\";\n    try (final InputStream stream = InfoHelper.class.getResourceAsStream(path)) {\n      final Properties props = new Properties();\n      props.load(stream);\n      VERSION = requireNonNull(props.getProperty(\"version\"));\n      URL = requireNonNull(props.getProperty(\"url\"));\n      YEAR = Integer.parseInt(requireNonNull(props.getProperty(\"year\")).trim());\n    } catch (IOException ex) {\n      throw new IllegalStateException(\"Can't read resource: \" + path, ex);\n    }\n  }\n\n  private InfoHelper() {\n  }\n\n  public static String getVersion() {\n    return \"v\" + VERSION;\n  }\n\n\n  public static String getCopyright() {\n    return \"Copyright (C) 2002-\" + YEAR + \" Igor A. Maznitsa (https://www.igormaznitsa.com)\";\n  }\n\n\n  public static String getSite() {\n    return \"Project page: \" + URL;\n  }\n\n\n  public static String getProductName() {\n    return \"Java Comment Preprocessor\";\n  }\n\n\n  public static List<String> makeTextForHelpInfo() {\n    final List<String> result = new ArrayList<>();\n\n    result.add(JcpPreprocessor.class.getCanonicalName() + \" [@cfgFile] [cliCommands]\");\n    result.add(\"\");\n\n    result.add(\"Command line\");\n    result.add(SHORT_DELIMITER);\n    result.add(\"allowed '/','-' and '--' prefixes, '--' doesn't support multiple commands at once\");\n    result.add(makeColumns(\"@cfgFile\", \"file contains global definition list\", 14));\n    result.addAll(JcpPreprocessor.getCommandLineHandlers().stream()\n        .map(InfoHelper::makeCommandLineKeyReference).collect(toList()));\n    result.add(DELIMITER);\n\n    result.add(\"Directives\");\n    result.add(SHORT_DELIMITER);\n    for (final AbstractDirectiveHandler handler : AbstractDirectiveHandler.findAllDirectives()) {\n      result.add(makeDirectiveReference(handler));\n    }\n    result.add(DELIMITER);\n    result.add(\"Special directives\");\n    result.add(SHORT_DELIMITER);\n    result\n        .add(makeSpecialDirectiveReference(\"//$\", \"uncomment and process all following macroses\"));\n    result.add(makeSpecialDirectiveReference(\"//$$\", \"like //$ but macroses ignored\"));\n    result.add(makeSpecialDirectiveReference(\"/*-*/\", \"truncate line\"));\n\n    result.add(\"Operators\");\n    result.add(SHORT_DELIMITER);\n    for (final AbstractOperator handler : AbstractOperator.getAllOperators()) {\n      result.add(makeOperatorReference(handler));\n    }\n    result.add(DELIMITER);\n    result.add(\"Functions\");\n    result.add(SHORT_DELIMITER);\n    for (final AbstractFunction handler : AbstractFunction.findAllFunctions()) {\n      result.add(makeFunctionReference(handler));\n    }\n    result.add(DELIMITER);\n    result.add(\"Allowed types\");\n    result.add(SHORT_DELIMITER);\n    result.add(\" BOOL: true,false\");\n    result.add(\"  INT: 2374,0x56FE (signed 64 bit)\");\n    result.add(\"  STR: \\\"Hello World!\\\" (or $Hello World!$ if in CLI)\");\n    result.add(\"FLOAT: 0.745 (signed 32 bit)\");\n    result.add(DELIMITER);\n    result.add(\"Special variables\");\n    result.add(SHORT_DELIMITER);\n    result.addAll(\n        getReference().stream().map(InfoHelper::makeSpecialVariableReference).collect(toList()));\n    return result;\n  }\n\n\n  private static String makeSpecialVariableReference(\n      final JCPSpecialVariableProcessor.NameReferencePair p) {\n    final String name = p.getName();\n    final String ref = p.getReference();\n    return makeColumns(name, ref, 24);\n  }\n\n\n  private static String makeCommandLineKeyReference(final CommandLineHandler handler) {\n    return makeColumns(handler.getKeyName(), handler.getDescription(), 14);\n  }\n\n\n  private static String makeDirectiveReference(final AbstractDirectiveHandler directive) {\n    final StringBuilder activityPasses = new StringBuilder();\n    int i = 0;\n    if (directive.isGlobalPhaseAllowed()) {\n      i++;\n      activityPasses.append(\"1st\");\n    }\n    if (directive.isPreprocessingPhaseAllowed()) {\n      if (i > 0) {\n        activityPasses.append(',');\n      }\n      activityPasses.append(\"2th\");\n      i++;\n    }\n    activityPasses.append(i > 1 ? \"passes\" : \" pass\");\n\n    final String directiveName = directive.getFullName();\n    final String descr =\n        (directive.isDeprecated() ? \"{DEPRECATED} \" : \"\") + directive.getReference() + \" (\" +\n            activityPasses + ')';\n    return makeColumns(directiveName, descr, 16);\n  }\n\n\n  private static String makeSpecialDirectiveReference(final String name, final String reference) {\n    return makeColumns(name, reference, 14);\n  }\n\n\n  private static String makeOperatorReference(final AbstractOperator operator) {\n    return makeColumns(operator.getKeyword(), operator.getReference(), 14);\n  }\n\n\n  private static String makeFunctionReference(final AbstractFunction func) {\n    final String funcName = func.getName();\n    final String description = func.getReference();\n\n    final StringBuilder variants = new StringBuilder(\"  [\");\n    final String result = func.getResultType().getSignature().toUpperCase(Locale.ROOT);\n\n    int variantIndex = 0;\n    for (final List<ValueType> signature : func.getAllowedArgumentTypes()) {\n      if (variantIndex > 0) {\n        variants.append(\" | \");\n      }\n      variants.append(result).append(' ').append(funcName).append(\" (\");\n      for (int i = 0; i < signature.size(); i++) {\n        if (i > 0) {\n          variants.append(',');\n        }\n        variants.append(signature.get(i).getSignature().toUpperCase(Locale.ROOT));\n      }\n      variants.append(')');\n      variantIndex++;\n    }\n    variants.append(']');\n    return makeColumns(funcName, description, 24) + variants;\n  }\n\n\n  private static String makeColumns(final String name, final String reference,\n                                    final int firstColumnWidth) {\n    final int spaces = firstColumnWidth - name.length();\n    final StringBuilder result = new StringBuilder(name);\n    result.append(\" \".repeat(Math.max(0, spaces)));\n    result.append(reference);\n    return result.toString();\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/JcpPreprocessor.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp;\n\nimport static com.igormaznitsa.jcp.InfoHelper.makeTextForHelpInfo;\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.fillContextByFoundServices;\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.readWholeTextFileIntoArray;\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.throwPreprocessorException;\n\nimport com.igormaznitsa.jcp.cmdline.ActionPreprocessorExtensionHandler;\nimport com.igormaznitsa.jcp.cmdline.AllowMergeBlockLineHandler;\nimport com.igormaznitsa.jcp.cmdline.AllowWhitespaceDirectiveHandler;\nimport com.igormaznitsa.jcp.cmdline.CareForLastEolHandler;\nimport com.igormaznitsa.jcp.cmdline.ClearTargetHandler;\nimport com.igormaznitsa.jcp.cmdline.CommandLineHandler;\nimport com.igormaznitsa.jcp.cmdline.DestinationDirectoryHandler;\nimport com.igormaznitsa.jcp.cmdline.DontOverwriteSameContentHandler;\nimport com.igormaznitsa.jcp.cmdline.ExcludeFoldersHandler;\nimport com.igormaznitsa.jcp.cmdline.ExcludedFileExtensionsHandler;\nimport com.igormaznitsa.jcp.cmdline.FileExtensionsHandler;\nimport com.igormaznitsa.jcp.cmdline.GlobalVariableDefiningFileHandler;\nimport com.igormaznitsa.jcp.cmdline.GlobalVariableHandler;\nimport com.igormaznitsa.jcp.cmdline.HelpHandler;\nimport com.igormaznitsa.jcp.cmdline.InCharsetHandler;\nimport com.igormaznitsa.jcp.cmdline.KeepAttributesHandler;\nimport com.igormaznitsa.jcp.cmdline.KeepCommentsHandler;\nimport com.igormaznitsa.jcp.cmdline.KeepLineHandler;\nimport com.igormaznitsa.jcp.cmdline.OutCharsetHandler;\nimport com.igormaznitsa.jcp.cmdline.PreserveIndentDirectiveHandler;\nimport com.igormaznitsa.jcp.cmdline.RemoveCommentsHandler;\nimport com.igormaznitsa.jcp.cmdline.SourceDirectoryHandler;\nimport com.igormaznitsa.jcp.cmdline.UnknownAsFalseHandler;\nimport com.igormaznitsa.jcp.cmdline.VerboseHandler;\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.context.PreprocessorContextAware;\nimport com.igormaznitsa.jcp.directives.ExcludeIfDirectiveHandler;\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.utils.AntPathMatcher;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Objects;\nimport java.util.Set;\nimport lombok.Data;\nimport org.apache.commons.io.FileUtils;\nimport org.apache.commons.io.FilenameUtils;\n\n/**\n * The main class implements the Java Comment Preprocessor, it has the main\n * method and can be started from a command string\n * Base directory for preprocessing can be provided through System property 'jcp.base.dir'\n * if it is not provided then current work directory will be recognized as base one.\n */\npublic final class JcpPreprocessor {\n\n  static final CommandLineHandler[] COMMAND_LINE_HANDLERS = new CommandLineHandler[] {\n      new HelpHandler(),\n      new InCharsetHandler(),\n      new OutCharsetHandler(),\n      new ClearTargetHandler(),\n      new SourceDirectoryHandler(),\n      new DestinationDirectoryHandler(),\n      new FileExtensionsHandler(),\n      new ExcludedFileExtensionsHandler(),\n      new AllowWhitespaceDirectiveHandler(),\n      new RemoveCommentsHandler(),\n      new KeepCommentsHandler(),\n      new KeepLineHandler(),\n      new DontOverwriteSameContentHandler(),\n      new VerboseHandler(),\n      new GlobalVariableDefiningFileHandler(),\n      new GlobalVariableHandler(),\n      new CareForLastEolHandler(),\n      new PreserveIndentDirectiveHandler(),\n      new ExcludeFoldersHandler(),\n      new KeepAttributesHandler(),\n      new ActionPreprocessorExtensionHandler(),\n      new AllowMergeBlockLineHandler(),\n      new UnknownAsFalseHandler()\n  };\n  private static final String PROPERTY_JCP_BASE_DIR = \"jcp.base.dir\";\n  private final PreprocessorContext context;\n\n  public JcpPreprocessor(final PreprocessorContext context) {\n    Objects.requireNonNull(context, \"Configurator is null\");\n    this.context = context;\n  }\n\n\n  public static List<CommandLineHandler> getCommandLineHandlers() {\n    return Arrays.asList(COMMAND_LINE_HANDLERS);\n  }\n\n  public static void main(final String... args) {\n    printHeader();\n\n    final String[] normalizedStrings = PreprocessorUtils\n        .replaceStringPrefix(new String[] {\"--\", \"-\"}, \"/\",\n            PreprocessorUtils.replaceChar(args, '$', '\\\"'));\n\n    PreprocessorContext preprocessorContext = null;\n\n    final File baseDir = getBaseDir();\n    System.out.println(\"Base directory: \" + baseDir);\n\n    try {\n      preprocessorContext = processCommandLine(baseDir, args, normalizedStrings);\n    } catch (Exception ex) {\n      System.err.println(\"Error during CLI processing: \" + ex.getMessage());\n      System.exit(1);\n    }\n\n    final JcpPreprocessor preprocessor = new JcpPreprocessor(preprocessorContext);\n\n    try {\n      preprocessor.execute();\n    } catch (Exception unexpected) {\n      System.err.println(PreprocessorException.referenceAsString(' ', unexpected));\n      System.exit(1);\n    }\n\n    System.exit(0);\n  }\n\n\n  private static File getBaseDir() {\n    final String baseDirInProperties = System\n        .getProperty(PROPERTY_JCP_BASE_DIR,\n            System.getProperty(\"user.dir\", new File(\"\").getAbsolutePath())\n        );\n    return new File(baseDirInProperties);\n  }\n\n\n  private static PreprocessorContext processCommandLine(final File baseDir,\n                                                        final String[] originalStrings,\n                                                        final String[] normalizedStrings) {\n    final PreprocessorContext result = new PreprocessorContext(baseDir);\n\n    for (int i = 0; i < normalizedStrings.length; i++) {\n      final String arg = normalizedStrings[i];\n      boolean processed = false;\n      for (final CommandLineHandler processor : getCommandLineHandlers()) {\n        if (processor.processCommandLineKey(arg, result)) {\n          processed = true;\n          if (processor instanceof HelpHandler) {\n            help();\n            System.exit(2);\n          }\n          break;\n        }\n      }\n\n      if (!processed) {\n        System.err.println(\"Can't process CLI argument, see manual: \" + originalStrings[i]);\n        System.out.println();\n        help();\n        System.exit(1);\n      }\n    }\n\n    fillContextByFoundServices(result);\n\n    return result;\n  }\n\n  private static void printHeader() {\n    System.out.println(InfoHelper.getProductName() + ' ' + InfoHelper.getVersion());\n    System.out.println(InfoHelper.getSite());\n    System.out.println(InfoHelper.getCopyright());\n  }\n\n  private static void help() {\n    System.out.println();\n\n    makeTextForHelpInfo().forEach(System.out::println);\n  }\n\n\n  public PreprocessorContext getContext() {\n    return this.context;\n  }\n\n  public Statistics execute() throws IOException {\n    final long timeStart = System.currentTimeMillis();\n    this.context.getActivatedConfigFiles().addAll(processConfigFiles());\n\n    this.context.logInfo(String\n        .format(\"File extensions: %s excluded %s\", this.context.getExtensions(),\n            this.context.getExcludeExtensions()));\n    final List<PreprocessorContext.SourceFolder> srcFolders = this.context.getSources();\n    this.context.logDebug(\"Source folders: \" + srcFolders);\n\n    if (srcFolders.isEmpty()) {\n      this.context.logWarning(\"Source folder list is empty!\");\n    }\n\n    final Collection<FileInfoContainer> filesToBePreprocessed =\n        collectFilesToPreprocess(srcFolders, this.context.getExcludeFolders());\n    this.context.addAllPreprocessedResources(filesToBePreprocessed);\n\n    final List<PreprocessingState.ExcludeIfInfo> excludedIf =\n        processGlobalDirectives(filesToBePreprocessed);\n\n    processFileExclusion(excludedIf);\n    if (!this.context.isDryRun()) {\n      createTargetFolder();\n    } else {\n      this.context.logInfo(\"Dry run mode is ON\");\n    }\n    final Statistics stat = this.preprocessFiles(filesToBePreprocessed, true);\n\n    final long elapsedTime = System.currentTimeMillis() - timeStart;\n    this.context.logInfo(\"-----------------------------------------------------------------\");\n    this.context.logInfo(String\n        .format(\"Preprocessed %d files, copied %d files, ignored %d files, elapsed time %d ms\",\n            stat.getPreprocessed(), stat.getCopied(), stat.getExcluded(), elapsedTime));\n    return stat;\n  }\n\n  private void processFileExclusion(final List<PreprocessingState.ExcludeIfInfo> foundExcludeIf) {\n    final String DIRECTIVE_NAME = new ExcludeIfDirectiveHandler().getFullName();\n\n    for (final PreprocessingState.ExcludeIfInfo item : foundExcludeIf) {\n      final String condition = item.getCondition();\n      final File file = item.getFileInfoContainer().getSourceFile();\n\n      Value val;\n\n      if (context.isVerbose()) {\n        context.logForVerbose(String\n            .format(\"Processing condition '%s' for file '%s'\", condition, file.getAbsolutePath()));\n      }\n\n      try {\n        val = Expression.evalExpression(condition, this.context);\n      } catch (PreprocessorException ex) {\n        throw new PreprocessorException(\n            ex.getMessage(),\n            condition,\n            new FilePositionInfo[] {new FilePositionInfo(file, item.getStringIndex())},\n            ex.getCause()\n        );\n      } catch (IllegalArgumentException ex) {\n        throw new PreprocessorException(\"Wrong expression at \" + DIRECTIVE_NAME,\n            condition,\n            new FilePositionInfo[] {new FilePositionInfo(file, item.getStringIndex())},\n            ex);\n      }\n\n      if (val.getType() != ValueType.BOOLEAN) {\n        throw new PreprocessorException(\"Expression at \" + DIRECTIVE_NAME + \" is not a boolean one\",\n            condition, new FilePositionInfo[] {new FilePositionInfo(file, item.getStringIndex())},\n            null);\n      }\n\n      if (val.asBoolean()) {\n        item.getFileInfoContainer().setExcluded(true);\n        if (context.isVerbose()) {\n          context.logForVerbose(String\n              .format(\"File '%s' excluded for active '%s' condition\", file.getAbsolutePath(),\n                  condition));\n        }\n      }\n    }\n  }\n\n\n  private List<PreprocessingState.ExcludeIfInfo> processGlobalDirectives(\n      final Collection<FileInfoContainer> files) throws IOException {\n    final List<PreprocessingState.ExcludeIfInfo> result = new ArrayList<>();\n    for (final FileInfoContainer fileRef : files) {\n      if (!(fileRef.isExcludedFromPreprocessing() || fileRef.isCopyOnly())) {\n        final long startTime = System.currentTimeMillis();\n        result.addAll(fileRef.processGlobalDirectives(context, null));\n        final long elapsedTime = System.currentTimeMillis() - startTime;\n        if (context.isVerbose()) {\n          context.logForVerbose(String\n              .format(\"Global phase completed for file '%s', elapsed time %d ms \",\n                  PreprocessorUtils.getFilePath(fileRef.getSourceFile()), elapsedTime));\n        }\n      }\n    }\n    return result;\n  }\n\n\n  private Statistics preprocessFiles(final Collection<FileInfoContainer> files,\n                                     final boolean notifyProcessors) throws IOException {\n    if (notifyProcessors) {\n      final List<PreprocessorContextAware> successfullyNotified = new ArrayList<>();\n      try {\n        context.fireNotificationStart(successfullyNotified);\n      } catch (final Exception ex) {\n        context.logError(\"Error during init of context aware processors: \" + ex.getMessage());\n        successfullyNotified.forEach(x -> {\n          try {\n            x.onContextStopped(context, ex);\n          } catch (Exception err) {\n            context.logError(\"Error: \" + err.getMessage());\n          }\n        });\n        throw new IllegalStateException(\"Exception during notification of context aware listeners\",\n            ex);\n      }\n    }\n\n    int preprocessedCounter = 0;\n    int copiedCounter = 0;\n    int excludedCounter = 0;\n\n    Throwable error = null;\n    try {\n      for (final FileInfoContainer fileRef : files) {\n        if (fileRef.isExcludedFromPreprocessing()) {\n          excludedCounter++;\n        } else if (fileRef.isCopyOnly()) {\n          if (!context.isDryRun()) {\n            final File destinationFile =\n                this.context.createDestinationFileForPath(fileRef.makeTargetFilePathAsString());\n            boolean doCopy = true;\n\n            if (this.context.isDontOverwriteSameContent() &&\n                PreprocessorUtils.isFileContentEquals(fileRef.getSourceFile(), destinationFile)) {\n              doCopy = false;\n              if (this.context.isVerbose()) {\n                this.context.logForVerbose(String\n                    .format(\"Copy skipped because same content: %s -> {dst} %s\",\n                        PreprocessorUtils.getFilePath(fileRef.getSourceFile()),\n                        fileRef.makeTargetFilePathAsString()));\n              }\n            }\n\n            if (doCopy) {\n              if (this.context.isVerbose()) {\n                this.context.logForVerbose(String.format(\"Copy file %s -> {dst} %s\",\n                    PreprocessorUtils.getFilePath(fileRef.getSourceFile()),\n                    fileRef.makeTargetFilePathAsString()));\n              }\n              PreprocessorUtils.copyFile(fileRef.getSourceFile(), destinationFile,\n                  this.context.isKeepAttributes());\n              fileRef.getGeneratedResources().add(destinationFile);\n              copiedCounter++;\n            }\n          }\n        } else {\n          final long startTime = System.currentTimeMillis();\n          fileRef.preprocessFileWithNotification(this.context, null, false);\n          final long elapsedTime = System.currentTimeMillis() - startTime;\n          if (this.context.isVerbose()) {\n            this.context.logForVerbose(String\n                .format(\"File preprocessing completed  '%s', elapsed time %d ms\",\n                    PreprocessorUtils.getFilePath(fileRef.getSourceFile()), elapsedTime));\n          }\n          preprocessedCounter++;\n        }\n      }\n    } catch (Throwable err) {\n      error = err;\n      if (error instanceof IOException) {\n        throw (IOException) error;\n      }\n      if (error instanceof RuntimeException) {\n        throw (RuntimeException) error;\n      }\n      if (error instanceof Error) {\n        throw (Error) error;\n      }\n    } finally {\n      context.fireNotificationStop(error);\n    }\n\n    return new Statistics(\n        preprocessedCounter,\n        copiedCounter,\n        excludedCounter\n    );\n  }\n\n  private void createTargetFolder() throws IOException {\n    final File target = context.getTarget();\n\n    final boolean targetExists = target.isDirectory();\n\n    if (context.isClearTarget() && targetExists) {\n      this.context.logForVerbose(\"Cleaning target folder: \" + target);\n      try {\n        FileUtils.cleanDirectory(target);\n      } catch (IOException ex) {\n        throw new IOException(\"Can't clean folder: \" + PreprocessorUtils.getFilePath(target), ex);\n      }\n    }\n\n    if (!targetExists && !target.mkdirs()) {\n      throw new IOException(\"Can't make folder: \" + PreprocessorUtils.getFilePath(target));\n    }\n\n    this.context.logForVerbose(\"Target folder has been prepared: \" + target);\n  }\n\n\n  private Collection<FileInfoContainer> collectFilesToPreprocess(\n      final List<PreprocessorContext.SourceFolder> sources, final List<String> excluded)\n      throws IOException {\n    final Collection<FileInfoContainer> result = new ArrayList<>();\n\n    final AntPathMatcher antPathMatcher = new AntPathMatcher();\n\n    for (final PreprocessorContext.SourceFolder sourceFolder : sources) {\n      String canonicalSourcePath = sourceFolder.getAsFile().getCanonicalPath();\n\n      this.context.logDebug(\"Processing folder: \" + sourceFolder);\n\n      if (!canonicalSourcePath.endsWith(File.separator)) {\n        canonicalSourcePath += File.separator;\n      }\n\n      for (final File file : findAllFiles(canonicalSourcePath, sourceFolder.getAsFile(),\n          antPathMatcher, excluded)) {\n        if (this.context.isFileExcludedByExtension(file)) {\n          this.context\n              .logForVerbose(String.format(\"File '%s' excluded by its extension\", file.getPath()));\n        } else {\n          final String canonicalFilePath = file.getCanonicalPath();\n          final String canonicalRelativePath =\n              canonicalFilePath.substring(canonicalSourcePath.length());\n          final FileInfoContainer reference = new FileInfoContainer(file, canonicalRelativePath,\n              !this.context.isFileAllowedForPreprocessing(file));\n          result.add(reference);\n          this.context.logDebug(\"File added to preprocess list: \" + reference);\n        }\n      }\n    }\n\n    return result;\n  }\n\n\n  private Set<File> findAllFiles(\n      final String sourceCanonicalPath,\n      final File dir,\n      final AntPathMatcher antPathMatcher,\n      final List<String> excludedFolderPatterns\n  ) throws IOException {\n\n    final Set<File> result = new HashSet<>();\n\n    this.context.logDebug(\"Looking for files in folder: \" + dir);\n\n    final File[] allowedFiles = dir.listFiles();\n    if (allowedFiles == null) {\n      this.context.logWarning(\"Can't find files in folder: \" + dir);\n    } else {\n      final String normalizedBasePath = FilenameUtils.normalize(sourceCanonicalPath, true);\n\n      for (final File file : allowedFiles) {\n        if (file.isDirectory()) {\n          final String folderPath = file.getCanonicalPath();\n          String excludedFolderPattern = null;\n\n          if (!excludedFolderPatterns.isEmpty()) {\n            final String subPathInBase = folderPath.substring(normalizedBasePath.length());\n\n            for (final String pattern : excludedFolderPatterns) {\n              if (antPathMatcher.match(pattern, subPathInBase)) {\n                excludedFolderPattern = pattern;\n                break;\n              }\n            }\n          }\n\n          if (excludedFolderPattern == null) {\n            result.addAll(\n                findAllFiles(sourceCanonicalPath, file, antPathMatcher, excludedFolderPatterns));\n          } else {\n            this.context.logForVerbose(\n                String.format(\"Folder '%s' excluded by '%s'\", folderPath, excludedFolderPattern));\n          }\n        } else {\n          result.add(file);\n        }\n      }\n    }\n    return result;\n  }\n\n  List<File> processConfigFiles() throws IOException {\n\n    final List<File> processedConfigFileList = new ArrayList<>();\n\n    for (final File file : context.getConfigFiles()) {\n      processedConfigFileList.add(file);\n\n      final String[] lines = readWholeTextFileIntoArray(file, StandardCharsets.UTF_8, null);\n\n      int readStringIndex = -1;\n      for (final String curString : lines) {\n        final String trimmed = curString.trim();\n        readStringIndex++;\n\n        if (trimmed.isEmpty() || trimmed.charAt(0) == '#') {\n          // do nothing\n        } else if (trimmed.charAt(0) == '@') {\n          throwPreprocessorException(\"Config file doesn't allow have lines started with '@'\",\n              trimmed, file, readStringIndex, null);\n        } else if (trimmed.charAt(0) == '/') {\n          // a command line argument\n          boolean processed = false;\n          try {\n            for (CommandLineHandler handler : getCommandLineHandlers()) {\n              if (context.isVerbose()) {\n                context.logForVerbose(String\n                    .format(\"Processing сonfig file key '%s' at %s:%d\", trimmed, file.getName(),\n                        readStringIndex + 1));\n              }\n              if (handler.processCommandLineKey(trimmed, context)) {\n                processed = true;\n                break;\n              }\n            }\n          } catch (Exception unexpected) {\n            throwPreprocessorException(\"Exception during directive processing\", trimmed, file,\n                readStringIndex, unexpected);\n          }\n\n          if (!processed) {\n            throwPreprocessorException(\"Unsupported or disallowed directive\", trimmed, file,\n                readStringIndex, null);\n          }\n        } else {\n          // a global variable\n          final String[] split = PreprocessorUtils.splitForEqualChar(trimmed);\n          if (split.length != 2) {\n            throwPreprocessorException(\"Wrong variable definition\", trimmed, file, readStringIndex,\n                null);\n          }\n          final String name = split[0].trim().toLowerCase(Locale.ROOT);\n          final String expression = split[1].trim();\n          if (name.isEmpty()) {\n            throwPreprocessorException(\"Empty variable name detected\", trimmed, file,\n                readStringIndex, null);\n          }\n\n          try {\n            final Value result = Expression.evalExpression(expression, this.context);\n            this.context.setGlobalVariable(name, result);\n\n            if (this.context.isVerbose()) {\n              this.context.logForVerbose(String\n                  .format(\"Registering global variable '%s' = '%s' (%s:%d)\", name,\n                      result, file.getName(), readStringIndex + 1));\n            }\n          } catch (Exception unexpected) {\n            throwPreprocessorException(\"Can't process the global variable definition\", trimmed,\n                file, readStringIndex, unexpected);\n          }\n        }\n      }\n    }\n    return processedConfigFileList;\n  }\n\n  @Data\n  public static final class Statistics {\n    private final int preprocessed;\n    private final int copied;\n    private final int excluded;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/ant/PreprocessTask.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.ant;\n\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.fillContextByFoundServices;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.context.SpecialVariableProcessor;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport com.igormaznitsa.jcp.utils.GetUtils;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.File;\nimport java.nio.charset.Charset;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.apache.commons.text.StringEscapeUtils;\nimport org.apache.tools.ant.BuildException;\nimport org.apache.tools.ant.Project;\nimport org.apache.tools.ant.Task;\n\n/**\n * The class implements an ANT task to allow calls for preprocessing from ANT build scripts. Also it allows to out messages from preprocessor directives into the ANT log and read\n * ANT properties as global variables (with the \"ant.\" prefix)\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\npublic class PreprocessTask extends Task implements PreprocessorLogger, SpecialVariableProcessor {\n  private Sources sources = null;\n  private String eol = null;\n  private boolean keepAttributes = false;\n  private String target = null;\n  private String sourceEncoding = null;\n  private String targetEncoding = null;\n  private boolean ignoreMissingSources = false;\n  private ExcludeExtensions excludeExtensions = null;\n  private Extensions extensions = null;\n  private boolean unknownVarAsFalse = false;\n  private boolean dryRun = false;\n  private boolean allowBlocks = false;\n  private boolean verbose = false;\n  private boolean clearTarget = false;\n  private boolean careForLastEol = false;\n  private String keepComments = CommentRemoverType.REMOVE_C_STYLE.name();\n  private Vars vars = null;\n  private ExcludeFolders excludeFolders = null;\n  private ConfigFiles configFiles = null;\n  private boolean keepLines = true;\n  private boolean allowWhitespaces = false;\n  private boolean preserveIndents = false;\n  private boolean dontOverwriteSameContent = false;\n  private String actionPreprocessorExtensions = \"\";\n  private Map<String, Value> antVariables = new HashMap<>();\n\n  private void registerConfigFiles(final PreprocessorContext context) {\n    if (this.getConfigFiles() != null) {\n      for (final Sources.Path f : this.getConfigFiles().getPaths()) {\n        log(\"Registering config file: \" + f.getValue());\n        context.registerConfigFile(\n            new File(Objects.requireNonNull(f, \"File must not be null\").getValue().trim()));\n      }\n    }\n  }\n\n  private void fillGlobalVars(final PreprocessorContext context) {\n    if (this.getVars() != null) {\n      for (final Vars.Var g : this.getVars().getListVars()) {\n        context.setGlobalVariable(Objects.requireNonNull(g.getName(), \"Name must not be null\"),\n            Value.recognizeRawString(\n                Objects.requireNonNull(g.getValue(), \"Value must not be null\")));\n      }\n    }\n  }\n\n  PreprocessorContext makePreprocessorContext() {\n    fillAntVariables();\n\n    final PreprocessorContext context = new PreprocessorContext(getProject().getBaseDir());\n    context.setPreprocessorLogger(this);\n    context.registerSpecialVariableProcessor(this);\n\n    if (this.getTarget() != null) {\n      context.setTarget(new File(this.getTarget()));\n    }\n\n    if (this.getSources() != null) {\n      context.setSources(this.getSources().getPaths()\n          .stream()\n          .map(Sources.Path::getValue)\n          .collect(Collectors.toList())\n      );\n    }\n\n    if (this.getExcludeExtensions() != null) {\n      context.setExcludeExtensions(this.getExcludeExtensions().listExtensions\n          .stream()\n          .map(x -> x.name.trim())\n          .filter(x -> !x.isEmpty())\n          .collect(Collectors.toList())\n      );\n    }\n    if (this.getExtensions() != null) {\n      context.setExtensions(this.getExtensions().listExtensions\n          .stream()\n          .map(x -> x.name.trim())\n          .filter(x -> !x.isEmpty())\n          .collect(Collectors.toList())\n      );\n    }\n\n    if (this.getSourceEncoding() != null) {\n      context.setSourceEncoding(Charset.forName(this.getSourceEncoding()));\n    }\n\n    if (this.getTargetEncoding() != null) {\n      context.setTargetEncoding(Charset.forName(this.getTargetEncoding()));\n    }\n\n    context.setDontOverwriteSameContent(this.isDontOverwriteSameContent());\n    context.setClearTarget(this.isClearTarget());\n    context.setDryRun(this.isDryRun());\n    context.setAllowsBlocks(this.isAllowBlocks());\n    context.setKeepComments(PreprocessorUtils.findCommentRemoverForId(this.getKeepComments()));\n    context.setVerbose(this.isVerbose());\n    context.setKeepLines(this.isKeepLines());\n    context.setCareForLastEol(this.isCareForLastEol());\n    context.setAllowWhitespaces(this.isAllowWhitespaces());\n    context.setPreserveIndents(this.isPreserveIndents());\n    context.setKeepAttributes(this.isKeepAttributes());\n    context.setUnknownVariableAsFalse(this.isUnknownVarAsFalse());\n\n    if (this.getEol() != null) {\n      context.setEol(StringEscapeUtils.unescapeJava(this.getEol()));\n    }\n\n    if (this.getExcludeFolders() != null) {\n      context.setExcludeFolders(\n          this.getExcludeFolders().getFolders()\n              .stream()\n              .map(ExcludeFolders.Folder::getPath)\n              .collect(Collectors.toList())\n      );\n    }\n\n    if (!this.getActionPreprocessorExtensions().isEmpty()) {\n      info(\"Instantiating action preprocessor extensions: \" +\n          this.getActionPreprocessorExtensions());\n      Arrays.stream(this.getActionPreprocessorExtensions().split(\",\"))\n          .filter(x -> !x.trim().isEmpty())\n          .forEach(x -> context.addPreprocessorExtension(\n              PreprocessorUtils.findAndInstantiatePreprocessorExtensionForClassName(\n                  x.trim())));\n    }\n\n    this.registerConfigFiles(context);\n    this.fillGlobalVars(context);\n\n    fillContextByFoundServices(context);\n\n    return context;\n  }\n\n  @Override\n  public void execute() throws BuildException {\n    PreprocessorContext context;\n    JcpPreprocessor preprocessor;\n\n    this.antVariables.clear();\n    this.antVariables.putAll(fillAntVariables());\n\n    try {\n      context = makePreprocessorContext();\n    } catch (Exception unexpected) {\n      final PreprocessorException pp =\n          PreprocessorException.extractPreprocessorException(unexpected);\n      throw new BuildException(pp == null ? unexpected.getMessage() : pp.toString(),\n          pp == null ? unexpected : pp);\n    }\n\n    preprocessor = new JcpPreprocessor(context);\n\n    try {\n      preprocessor.execute();\n    } catch (Exception unexpected) {\n      final PreprocessorException pp =\n          PreprocessorException.extractPreprocessorException(unexpected);\n      throw new BuildException(pp == null ? unexpected.getMessage() : pp.toString(),\n          pp == null ? unexpected : pp);\n    }\n  }\n\n  @Override\n  public void error(final String message) {\n    log(message, Project.MSG_ERR);\n  }\n\n  @Override\n  public void info(final String message) {\n    log(message, Project.MSG_INFO);\n  }\n\n  @Override\n  public void debug(final String message) {\n    log(message, Project.MSG_DEBUG);\n  }\n\n  @Override\n  public void debug(final Supplier<String> supplier) {\n    if (supplier != null) {\n      final String text = supplier.get();\n      if (text != null) {\n        log(text, Project.MSG_DEBUG);\n      }\n    }\n  }\n\n  @Override\n  public void warning(final String message) {\n    log(message, Project.MSG_WARN);\n  }\n\n  private Map<String, Value> fillAntVariables() {\n    final Project theProject = getProject();\n\n    final Map<String, Value> result;\n\n    if (theProject == null) {\n      result = Collections.emptyMap();\n    } else {\n      result = new HashMap<>();\n\n      for (final Object key : getProject().getProperties().keySet()) {\n        final String keyStr = key.toString();\n        final String value = theProject.getProperty(keyStr);\n        if (value != null) {\n          result.put(\"ant.\" + keyStr.toLowerCase(Locale.ROOT), Value.valueOf(value));\n        }\n      }\n    }\n    return result;\n  }\n\n  @Override\n  public Set<String> getVariableNames() {\n    final Set<String> result;\n    if (this.antVariables == null) {\n      result = Set.of();\n    } else {\n      result = this.antVariables.keySet();\n    }\n    return result;\n  }\n\n  @Override\n  public Value getVariable(final String varName, final PreprocessorContext context) {\n    if (antVariables == null) {\n      throw context.makeException(\"Non-initialized ANT property map detected\", null);\n    }\n    final Value result = this.antVariables.get(varName);\n\n    if (result == null) {\n      throw context.makeException(\"Request for unsupported Ant property '\" + varName + '\\'', null);\n    }\n    return result;\n  }\n\n  @Override\n  public void setVariable(final String varName, final Value value,\n                          final PreprocessorContext context) {\n    throw context.makeException(\n        \"Request to change ANT property '\" + varName + \"'. NB! ANT properties are read only!\",\n        null);\n  }\n\n  public Extensions createExtensions() {\n    this.extensions = new Extensions();\n    return this.extensions;\n  }\n\n  public ExcludeExtensions createExcludeExtensions() {\n    this.excludeExtensions = new ExcludeExtensions();\n    return this.excludeExtensions;\n  }\n\n  public ExcludeFolders createExcludeFolders() {\n    this.excludeFolders = new ExcludeFolders();\n    return this.excludeFolders;\n  }\n\n  public Sources createSources() {\n    this.sources = new Sources();\n    return this.sources;\n  }\n\n  public ConfigFiles createConfigFiles() {\n    this.configFiles = new ConfigFiles();\n    return this.configFiles;\n  }\n\n  public Vars createVars() {\n    this.vars = new Vars();\n    return this.vars;\n  }\n\n  @Data\n  @EqualsAndHashCode(callSuper = false)\n  public static class Sources {\n\n    protected List<Path> paths = new ArrayList<>();\n\n    public Path createPath() {\n      final Path result = new Path();\n      paths.add(result);\n      return result;\n    }\n\n    @Data\n    public static class Path {\n      private String value = \"\";\n\n      public void addText(final String text) {\n        this.value += GetUtils.ensureNonNull(text, \"\");\n      }\n    }\n\n  }\n\n  @Data\n  @EqualsAndHashCode(callSuper = false)\n  public static class ConfigFiles extends Sources {\n\n  }\n\n  @Data\n  @EqualsAndHashCode(callSuper = false)\n  public static class ExcludeFolders {\n\n    private List<Folder> folders = new ArrayList<>();\n\n    public Folder createFolder() {\n      final Folder result = new Folder();\n      this.folders.add(result);\n      return result;\n    }\n\n    @Data\n    public static class Folder {\n      private String path = \"\";\n\n      public void addText(final String text) {\n        this.path = GetUtils.ensureNonNull(text, \"\");\n      }\n    }\n  }\n\n  @Data\n  @EqualsAndHashCode(callSuper = false)\n  public static class ExcludeExtensions extends Extensions {\n\n  }\n\n  @Data\n  @EqualsAndHashCode(callSuper = false)\n  public static class Extensions {\n    protected final List<Extension> listExtensions = new ArrayList<>();\n\n    public Extension createExtension() {\n      final Extension result = new Extension();\n      this.listExtensions.add(result);\n      return result;\n    }\n\n    @Data\n    public static class Extension {\n      private String name = \"\";\n\n      public void addText(final String text) {\n        this.name += GetUtils.ensureNonNull(text, \"\");\n      }\n    }\n  }\n\n  @Data\n  @EqualsAndHashCode(callSuper = false)\n  public static class Vars {\n    private List<Var> listVars = new ArrayList<>();\n\n    public Var createVar() {\n      final Var result = new Var();\n      this.listVars.add(result);\n      return result;\n    }\n\n    @Data\n    @EqualsAndHashCode(callSuper = false)\n    public static class Var {\n      private String name = \"\";\n      private String value = \"\";\n\n      public void addText(final String text) {\n        this.value += text;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/ActionPreprocessorExtensionHandler.java",
    "content": "package com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.Locale;\n\npublic class ActionPreprocessorExtensionHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/EA:\";\n\n  @Override\n  public String getDescription() {\n    return \"class for action directives (must be in classpath with default constructor)\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (!key.isEmpty() && key.toUpperCase(Locale.ROOT).startsWith(ARG_NAME)) {\n      final String tail = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n\n      if (!tail.isEmpty()) {\n        final PreprocessorExtension preprocessorExtension =\n            PreprocessorUtils.findAndInstantiatePreprocessorExtensionForClassName(tail);\n        context.addPreprocessorExtension(preprocessorExtension);\n      }\n      result = true;\n    }\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/AllowMergeBlockLineHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * Enable merging of text lines found in //$\"\"\" and //$$\"\"\" into single text block\n * for processing by external processors.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n * @since 7.2.0\n */\npublic class AllowMergeBlockLineHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/B\";\n\n  @Override\n  public String getDescription() {\n    return \"treat //$\\\"\\\"\\\" and //$$\\\"\\\"\\\" prefixed lines as single text block\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (ARG_NAME.equalsIgnoreCase(key)) {\n      context.setAllowsBlocks(true);\n      result = true;\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/AllowWhitespaceDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * Allow spaces between comment and directive.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class AllowWhitespaceDirectiveHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/ES\";\n\n  @Override\n  public String getDescription() {\n    return \"enable whitespace-tolerant mode between // and #\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (ARG_NAME.equalsIgnoreCase(key)) {\n      context.setAllowWhitespaces(true);\n      result = true;\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/CareForLastEolHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class CareForLastEolHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/N\";\n\n  @Override\n  public String getDescription() {\n    return \"preserve last line EOL in output\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (ARG_NAME.equalsIgnoreCase(key)) {\n      context.setCareForLastEol(true);\n      result = true;\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/ClearTargetHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The handler to process the key signals that the preprocessor must clear the\n * destination directory before preprocessing\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ClearTargetHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/C\";\n\n  @Override\n  public String getDescription() {\n    return \"clear target folder before preprocessing\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n    if (ARG_NAME.equalsIgnoreCase(key)) {\n      context.setClearTarget(true);\n      result = true;\n    }\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/CommandLineHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The interface describes a command line key handler. It is not just a handler,\n * but it will be called for all met keys to recognize one to be processed.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic interface CommandLineHandler {\n\n  /**\n   * Get the key name for the handler\n   *\n   * @return the key name as a String, must not be null\n   */\n  String getKeyName();\n\n  /**\n   * Get the description of the key (it will be printed into the help text)\n   *\n   * @return the description as a String\n   */\n  String getDescription();\n\n  /**\n   * Process a command line key\n   *\n   * @param key     the command line key to be processed, must not be null\n   * @param context the preprocessor context, must not be null\n   * @return true if the key has been recognized and processed else false\n   */\n  boolean processCommandLineKey(String key, PreprocessorContext context);\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/DestinationDirectoryHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.File;\nimport java.util.Locale;\n\n/**\n * The handler for the output directory command line key\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class DestinationDirectoryHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/O:\";\n\n  @Override\n  public String getDescription() {\n    return \"set destination folder (default \" +\n        PreprocessorContext.DEFAULT_DEST_DIRECTORY + ')';\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (!key.isEmpty() && key.toUpperCase(Locale.ROOT).startsWith(ARG_NAME)) {\n      final String name = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n      if (!name.isEmpty()) {\n        final String path = PreprocessorUtils.extractTail(ARG_NAME, key);\n        context.setTarget(new File(path));\n        result = true;\n      }\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/DontOverwriteSameContentHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * the Handler processes command to disable overriding of existing file if content the same.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n * @since 6.0.1\n */\npublic class DontOverwriteSameContentHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/Z\";\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n  @Override\n  public String getDescription() {\n    return \"skip writing target file if content unchanged\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (ARG_NAME.equalsIgnoreCase(key)) {\n      context.setDontOverwriteSameContent(true);\n      result = true;\n    }\n\n    return result;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/ExcludeFoldersHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.File;\nimport java.util.Locale;\n\n/**\n * The Handler of subfolder names to be excluded from preprocessing, allows ANT pattern matching.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ExcludeFoldersHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/ED:\";\n\n  @Override\n  public String getDescription() {\n    return \"folders to exclude (ANT pattern, delimited by system path separator)\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (!key.isEmpty() && key.toUpperCase(Locale.ROOT).startsWith(ARG_NAME)) {\n      final String tail = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n\n      if (!tail.isEmpty()) {\n        context.setExcludeFolders(PreprocessorUtils.splitForChar(tail, File.pathSeparatorChar));\n        result = true;\n      }\n    }\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/ExcludedFileExtensionsHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.Arrays;\nimport java.util.Locale;\nimport java.util.stream.Collectors;\n\n/**\n * The handler for the excluded extension list (with comma)\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ExcludedFileExtensionsHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/EF:\";\n\n  @Override\n  public String getDescription() {\n    return\n        \"comma-separated file extensions to exclude (default: \" +\n            String.join(\",\", PreprocessorContext.DEFAULT_EXCLUDED_EXTENSIONS) + ')';\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (!key.isEmpty() && key.toUpperCase(Locale.ROOT).startsWith(ARG_NAME)) {\n      final String extensions = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n      if (!extensions.isEmpty()) {\n        context.setExcludeExtensions(\n            Arrays.stream(extensions.split(\",\")).map(String::trim).collect(Collectors.toList()));\n        result = true;\n      }\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/FileExtensionsHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.Arrays;\nimport java.util.Locale;\nimport java.util.stream.Collectors;\n\n/**\n * The handler for the preprocessing file extension list (with comma)\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class FileExtensionsHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/F:\";\n\n  @Override\n  public String getDescription() {\n    return \"comma-separated allowed extensions (default: \" +\n        String.join(\",\", PreprocessorContext.DEFAULT_PROCESSING_EXTENSIONS) + ')';\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (!key.isEmpty() && key.toUpperCase(Locale.ROOT).startsWith(ARG_NAME)) {\n      final String extensions = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n\n      if (!extensions.isEmpty()) {\n        context.setExtensions(\n            Arrays.stream(extensions.split(\"\\\\,\")).map(String::trim).collect(Collectors.toList()));\n        result = true;\n      }\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/GlobalVariableDefiningFileHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.File;\n\n/**\n * The handler for '@' prefixed files in the command string\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class GlobalVariableDefiningFileHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"@\";\n\n  @Override\n  public String getDescription() {\n    return \"load global variables from file (path or @@expression)\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (!key.isEmpty() && key.charAt(0) == '@') {\n      String stringRest = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n\n      if (stringRest.isEmpty()) {\n        throw context.makeException(\"Empty string\", null);\n      }\n\n      File file;\n\n      if (stringRest.charAt(0) == '@') {\n        stringRest = PreprocessorUtils.extractTrimmedTail(\"@\", stringRest);\n\n        if (context.isVerbose()) {\n          context.logForVerbose(\n              \"Global parameter file defined through expression '\" + stringRest + '\\'');\n        }\n\n        final Value resultValue = Expression.evalExpression(stringRest, context);\n\n        final String fileName = resultValue.toString();\n        file = new File(fileName);\n      } else {\n        file = new File(stringRest);\n      }\n\n      if (context.isVerbose()) {\n        context.logForVerbose(\n            \"Reading global definition file [\" + PreprocessorUtils.getFilePath(file) + \"]  '\" +\n                stringRest + '\\'');\n      }\n      if (file.isFile()) {\n        context.registerConfigFile(file);\n      } else {\n        throw context.makeException(\n            \"Can't find the global definition file '\" + PreprocessorUtils.getFilePath(file) + '\\'',\n            null);\n      }\n\n      result = true;\n    }\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/GlobalVariableHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.Locale;\n\n/**\n * The handler for global variables, it adds met global variables into the\n * internal storage\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class GlobalVariableHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/P:\";\n\n  @Override\n  public String getDescription() {\n    return \"define global variable (e.g., /P:DEBUG=true; use $ for \\\" in CLI)\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (!key.isEmpty() && key.toUpperCase(Locale.ROOT).startsWith(ARG_NAME)) {\n\n      final String nameAndExpression = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n\n      if (!nameAndExpression.isEmpty()) {\n\n        final String[] split = PreprocessorUtils.splitForEqualChar(nameAndExpression);\n        if (split.length != 2) {\n          throw context.makeException(\n              \"Illegal expression for directive '\" + ARG_NAME + \"' [\" + nameAndExpression + ']',\n              null);\n        }\n\n        final String value = split[0];\n        final String expression = split[1];\n\n        if (context.containsGlobalVariable(value)) {\n          throw context.makeException(\"Duplicated global definition [\" + value + ']', null);\n        }\n\n        final Value resultVal = Expression.evalExpression(expression, context);\n        context.setGlobalVariable(value, resultVal);\n        result = true;\n      }\n    }\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/HelpHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.Locale;\n\n/**\n * The handler processes a help command from the command string\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class HelpHandler implements CommandLineHandler {\n\n  private static final String[] ARG_NAMES = new String[] {\"/H\", \"/?\", \"-H\", \"-?\"};\n\n  @Override\n  public String getDescription() {\n    return \"display preprocessor usage and directives info\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n    if (!key.isEmpty()) {\n\n      final String argUpperCase = key.trim().toUpperCase(Locale.ROOT);\n\n      for (final String str : ARG_NAMES) {\n        if (str.equals(argUpperCase)) {\n          result = true;\n          break;\n        }\n      }\n    }\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    final StringBuilder result = new StringBuilder();\n    for (int li = 0; li < ARG_NAMES.length; li++) {\n      if (li > 0) {\n        result.append(',');\n      }\n      result.append(ARG_NAMES[li]);\n    }\n    return result.toString();\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/InCharsetHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.nio.charset.Charset;\nimport java.util.Locale;\n\n/**\n * To set the input text character encoding\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class InCharsetHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/T:\";\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n  @Override\n  public String getDescription() {\n    return \"set input text file encoding (default: \" +\n        PreprocessorContext.DEFAULT_CHARSET + ')';\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n\n    boolean result = false;\n\n    if (key.toUpperCase(Locale.ROOT).startsWith(ARG_NAME)) {\n      final String value = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n\n      if (!value.isEmpty() && Charset.isSupported(value)) {\n        context.setSourceEncoding(Charset.forName(value));\n        result = true;\n      }\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/KeepAttributesHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The handler keep file attributes of copied or generated files.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class KeepAttributesHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/A\";\n\n  @Override\n  public String getDescription() {\n    return \"preserve original file attributes\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (ARG_NAME.equalsIgnoreCase(key)) {\n      context.setKeepAttributes(true);\n      result = true;\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/KeepCommentsHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static com.igormaznitsa.jcp.context.CommentRemoverType.makeListOfAllRemoverIds;\n\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.Locale;\n\n/**\n * The handler allows to choose keep comments mode.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n * @since 7.1.0\n */\npublic class KeepCommentsHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/M:\";\n\n  @Override\n  public String getDescription() {\n    return \"set comment handling mode (e.g., /M:remove_c_style; allowed: true,false,\" +\n        makeListOfAllRemoverIds() + ')';\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (!key.isEmpty() && key.toUpperCase(Locale.ROOT).startsWith(ARG_NAME)) {\n      final String tail = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n\n      final CommentRemoverType mode;\n      try {\n        mode = PreprocessorUtils.findCommentRemoverForId(tail);\n      } catch (IllegalArgumentException ex) {\n        throw context.makeException(\n            \"Illegal keep comments mode '\" + tail + \"' in \" + ARG_NAME +\n                \", expected one of: true,false,\" +\n                makeListOfAllRemoverIds(), null);\n      }\n\n      context.setKeepComments(mode);\n\n      result = true;\n    }\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/KeepLineHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The handler processing the flag tells the preprocessor to be try to keep\n * non-executing lines of code as commented ones\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class KeepLineHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/K\";\n\n  @Override\n  public String getDescription() {\n    return \"preserve line numbers, print unprocessed lines as comments\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (ARG_NAME.equalsIgnoreCase(key)) {\n      context.setKeepLines(true);\n      result = true;\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/OutCharsetHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.nio.charset.Charset;\nimport java.util.Locale;\n\n/**\n * To set the output text character encoding\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class OutCharsetHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/TT:\";\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n  @Override\n  public String getDescription() {\n    return \"set output text file encoding (default: \" +\n        PreprocessorContext.DEFAULT_CHARSET + ')';\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n\n    boolean result = false;\n\n    if (key.toUpperCase(Locale.ROOT).startsWith(ARG_NAME)) {\n      final String value = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n\n      if (!value.isEmpty()) {\n        if (Charset.isSupported(value)) {\n          context.setTargetEncoding(Charset.forName(value));\n          result = true;\n        }\n      }\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/PreserveIndentDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * Preserve indent when removing line-prefixes \"//$\" and \"//$$\"\n */\npublic class PreserveIndentDirectiveHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/PI\";\n\n  @Override\n  public String getDescription() {\n    return \"preserve indentation when removing //$ and //$$\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (ARG_NAME.equalsIgnoreCase(key)) {\n      context.setPreserveIndents(true);\n      result = true;\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/RemoveCommentsHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * Processes the flag that clears all source files from the destination directory, stripping them even from within comments.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class RemoveCommentsHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/R\";\n\n  @Override\n  public String getDescription() {\n    return \"strip all comments in result files\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String argument,\n                                       final PreprocessorContext configurator) {\n    boolean result = false;\n\n    if (ARG_NAME.equalsIgnoreCase(argument)) {\n      configurator.setKeepComments(CommentRemoverType.REMOVE_C_STYLE);\n      result = true;\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/SourceDirectoryHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.extractTail;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.File;\nimport java.util.Arrays;\nimport java.util.Locale;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\n\n/**\n * The handler processing the key to set the source directory\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class SourceDirectoryHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/I:\";\n\n  @Override\n  public String getDescription() {\n    return \"set source folder for preprocessing (default: \" +\n        PreprocessorContext.DEFAULT_SOURCE_DIRECTORY + ')';\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (!key.isEmpty() && key.toUpperCase(Locale.ROOT).startsWith(ARG_NAME)) {\n      final String tail = PreprocessorUtils.extractTrimmedTail(ARG_NAME, key);\n      if (!tail.isEmpty()) {\n        context.setSources(\n            Arrays.stream(extractTail(ARG_NAME, key).split(Pattern.quote(File.pathSeparator)))\n                .map(String::trim).collect(Collectors.toList()));\n        result = true;\n      }\n    }\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/UnknownAsFalseHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The handler processing the flag tells the preprocessor to be try to keep\n * non-executing lines of code as commented ones\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class UnknownAsFalseHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/U\";\n\n  @Override\n  public String getDescription() {\n    return \"treat unknown variables as FALSE\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (ARG_NAME.equalsIgnoreCase(key)) {\n      context.setUnknownVariableAsFalse(true);\n      result = true;\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/cmdline/VerboseHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The handler processing the flag that the preprocessor to be verbose in its\n * messages and information\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class VerboseHandler implements CommandLineHandler {\n\n  private static final String ARG_NAME = \"/V\";\n\n  @Override\n  public String getDescription() {\n    return \"enable verbose logging (info stream)\";\n  }\n\n  @Override\n  public boolean processCommandLineKey(final String key, final PreprocessorContext context) {\n    boolean result = false;\n\n    if (ARG_NAME.equalsIgnoreCase(key)) {\n      context.setVerbose(true);\n      result = true;\n    }\n\n    return result;\n  }\n\n  @Override\n  public String getKeyName() {\n    return ARG_NAME;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/containers/FileInfoContainer.java",
    "content": "/*\r\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\r\n *\r\n * Licensed to the Apache Software Foundation (ASF) under one\r\n * or more contributor license agreements.  See the NOTICE file\r\n * distributed with this work for additional information\r\n * regarding copyright ownership.  The ASF licenses this file\r\n * to you under the Apache License, Version 2.0 (the\r\n * \"License\"); you may not use this file except in compliance\r\n * with the License.  You may obtain a copy of the License at\r\n *\r\n *   http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing,\r\n * software distributed under the License is distributed on an\r\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n * KIND, either express or implied.  See the License for the\r\n * specific language governing permissions and limitations\r\n * under the License.\r\n */\r\n\r\npackage com.igormaznitsa.jcp.containers;\r\n\r\nimport static java.util.Objects.requireNonNull;\r\nimport static java.util.Objects.requireNonNullElse;\r\n\r\nimport com.igormaznitsa.jcp.context.CommentTextProcessor;\r\nimport com.igormaznitsa.jcp.context.PreprocessingState;\r\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\r\nimport com.igormaznitsa.jcp.context.PreprocessorContextAware;\r\nimport com.igormaznitsa.jcp.directives.AbstractDirectiveHandler;\r\nimport com.igormaznitsa.jcp.directives.AfterDirectiveProcessingBehaviour;\r\nimport com.igormaznitsa.jcp.directives.DirectiveArgumentType;\r\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\r\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\r\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\r\nimport com.igormaznitsa.jcp.utils.ResettablePrinter;\r\nimport java.io.File;\r\nimport java.io.IOException;\r\nimport java.util.ArrayList;\r\nimport java.util.Collection;\r\nimport java.util.HashSet;\r\nimport java.util.List;\r\nimport java.util.Map;\r\nimport java.util.Set;\r\nimport java.util.concurrent.atomic.AtomicReference;\r\nimport java.util.regex.Matcher;\r\nimport java.util.regex.Pattern;\r\nimport java.util.stream.Collectors;\r\nimport java.util.stream.IntStream;\r\nimport lombok.Data;\r\n\r\n/**\r\n * The class is one from the main classes in the preprocessor because it describes a preprocessing file and contains business logic for the process\r\n *\r\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\r\n */\r\n@Data\r\npublic class FileInfoContainer {\r\n\r\n  public static final String WARNING_SPACE_BEFORE_HASH =\r\n      \"Detected hash prefixed comment line with whitespace, directive may be lost: \";\r\n  private static final Pattern DIRECTIVE_HASH_PREFIXED = Pattern.compile(\"^\\\\s*//\\\\s*#(.*)$\");\r\n  private static final Pattern DIRECTIVE_TWO_DOLLARS_PREFIXED =\r\n      Pattern.compile(\"^\\\\s*//\\\\s*\\\\$\\\\$(.*)$\");\r\n  private static final Pattern DIRECTIVE_TWO_DOLLARS_BLOCK_PREFIXED =\r\n      Pattern.compile(\"^\\\\s*//\\\\s*\\\\$\\\\$\\\"\\\"\\\"(.*)$\");\r\n  private static final Pattern DIRECTIVE_SINGLE_DOLLAR_PREFIXED =\r\n      Pattern.compile(\"^\\\\s*//\\\\s*\\\\$(.*)$\");\r\n  private static final Pattern DIRECTIVE_SINGLE_DOLLAR_BLOCK_PREFIXED =\r\n      Pattern.compile(\"^\\\\s*//\\\\s*\\\\$\\\"(.*)$\");\r\n  private static final Pattern DIRECTIVE_TAIL_REMOVER = Pattern.compile(\"\\\\/\\\\*\\\\s*-\\\\s*\\\\*\\\\/\");\r\n  private static final String EOL_MARKER = \"-=$$$$$$$$__EOL__$$$$$$$$=-\";\r\n  /**\r\n   * The source file for the container\r\n   */\r\n  private final File sourceFile;\r\n  /**\r\n   * The flag shows that the file should be just copied into the destination place without any preprocessing\r\n   */\r\n  private final boolean copyOnly;\r\n  /**\r\n   * Collection of files generated with the file.\r\n   */\r\n  private final Collection<File> generatedResources = new HashSet<>();\r\n  /**\r\n   * Collection of files which took part during preprocessing of the file\r\n   */\r\n  private final Collection<File> includedSources = new HashSet<>();\r\n  /**\r\n   * The flag shows that the file has been excluded from preprocessing and it will not be preprocessed and copied\r\n   */\r\n  private boolean excludedFromPreprocessing;\r\n  /**\r\n   * The destination directory for the file\r\n   */\r\n  private String targetFolder;\r\n  /**\r\n   * The destination name for the file\r\n   */\r\n  private String targetFileName;\r\n\r\n  public FileInfoContainer(final File srcFile, final String targetFileName,\r\n                           final boolean copyOnly) {\r\n    requireNonNull(srcFile, \"Source file is null\");\r\n    requireNonNull(targetFileName, \"Target file name is null\");\r\n\r\n    this.copyOnly = copyOnly;\r\n    excludedFromPreprocessing = false;\r\n    sourceFile = srcFile;\r\n\r\n    int lastDirSeparator = targetFileName.lastIndexOf('/');\r\n    if (lastDirSeparator < 0) {\r\n      lastDirSeparator = targetFileName.lastIndexOf('\\\\');\r\n    }\r\n\r\n    if (lastDirSeparator < 0) {\r\n      this.targetFolder = \".\" + File.separatorChar;\r\n      this.targetFileName = targetFileName;\r\n    } else {\r\n      this.targetFolder = targetFileName.substring(0, lastDirSeparator);\r\n      this.targetFileName = targetFileName.substring(lastDirSeparator + 1);\r\n    }\r\n  }\r\n\r\n  private static String findTailRemover(final String str, final PreprocessorContext context) {\r\n    String result = str;\r\n    if (context.isAllowWhitespaces()) {\r\n      final Matcher matcher = DIRECTIVE_TAIL_REMOVER.matcher(str);\r\n      if (matcher.find()) {\r\n        result = str.substring(0, matcher.start());\r\n      }\r\n    } else {\r\n      final int tailRemoverStart = str.indexOf(\"/*-*/\");\r\n      if (tailRemoverStart >= 0) {\r\n        result = str.substring(0, tailRemoverStart);\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Check that text line starts with two commented dollar chars\r\n   *\r\n   * @param line               text line to be examined, must not be null\r\n   * @param allowedWhitespaces if true then whitespaces allowed after line comment\r\n   * @return true if the line starts with two commented dollar chars, false otherwise\r\n   * @since 7.0.6\r\n   */\r\n  public static boolean isDoubleDollarPrefixed(final String line,\r\n                                               final boolean allowedWhitespaces) {\r\n    if (allowedWhitespaces) {\r\n      return DIRECTIVE_TWO_DOLLARS_PREFIXED.matcher(line).matches();\r\n    } else {\r\n      return line.startsWith(\"//$$\");\r\n    }\r\n  }\r\n\r\n  public static boolean isDollarBlockPrefixed(final String line, final boolean allowedWhitespaces) {\r\n    if (allowedWhitespaces) {\r\n      return DIRECTIVE_SINGLE_DOLLAR_BLOCK_PREFIXED.matcher(line).matches();\r\n    } else {\r\n      return line.startsWith(\"//$\\\"\\\"\\\"\");\r\n    }\r\n  }\r\n\r\n  public static boolean isDoubleDollarBlockPrefixed(final String line,\r\n                                                    final boolean allowedWhitespaces) {\r\n    if (allowedWhitespaces) {\r\n      return DIRECTIVE_SINGLE_DOLLAR_BLOCK_PREFIXED.matcher(line).matches();\r\n    } else {\r\n      return line.startsWith(\"//$$\\\"\\\"\\\"\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check that text line starts with single dollar chars\r\n   *\r\n   * @param line               text line to be examined, must not be null\r\n   * @param allowedWhitespaces if true then whitespaces allowed after line comment\r\n   * @return true if the line starts with single dollar chars, false otherwise\r\n   * @since 7.0.6\r\n   */\r\n  public static boolean isSingleDollarPrefixed(final String line,\r\n                                               final boolean allowedWhitespaces) {\r\n    if (allowedWhitespaces) {\r\n      return DIRECTIVE_SINGLE_DOLLAR_PREFIXED.matcher(line).matches();\r\n    } else {\r\n      return line.startsWith(\"//$\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Allows to check that a text line can be considered as a JCP directive or special line.\r\n   *\r\n   * @param line               text line to be examined\r\n   * @param allowedWhitespaces if true then whitespaces allowed after line comment\r\n   * @return true if the line can be considered as JCP one, false otherwise\r\n   * @since 7.0.6\r\n   */\r\n  public static boolean isJcpCommentLine(final String line, final boolean allowedWhitespaces) {\r\n    return isJcpDirectiveLine(line, allowedWhitespaces)\r\n        || isSingleDollarPrefixed(line, allowedWhitespaces);\r\n  }\r\n\r\n  /**\r\n   * Check that a text line contains comment directive.\r\n   *\r\n   * @param line             string to be examined\r\n   * @param allowWhitespaces flag to allow spaces betwee hash and started comment chars\r\n   * @return true if the line contains a directive, false otherwise\r\n   * @since 7.0.6\r\n   */\r\n  public static boolean isJcpDirectiveLine(final String line, final boolean allowWhitespaces) {\r\n    if (allowWhitespaces) {\r\n      return DIRECTIVE_HASH_PREFIXED.matcher(line).matches();\r\n    } else {\r\n      return line.startsWith(AbstractDirectiveHandler.DIRECTIVE_PREFIX);\r\n    }\r\n  }\r\n\r\n  private static int findLastReadStringIndexInStack(final PreprocessingState nullableState) {\r\n    if (nullableState == null) {\r\n      return -1;\r\n    }\r\n\r\n    var fileData = nullableState.peekIncludeStackFile();\r\n    if (fileData == null) {\r\n      return -1;\r\n    } else {\r\n      return fileData.getLastReadStringIndex();\r\n    }\r\n  }\r\n\r\n  public void setTargetFolder(final String folder) {\r\n    this.targetFolder = requireNonNull(folder, \"Target folder must not be null\");\r\n  }\r\n\r\n  public void setTargetFileName(final String name) {\r\n    this.targetFileName =\r\n        requireNonNull(name, \"Target file name must not be null\");\r\n  }\r\n\r\n  public String makeTargetFilePathAsString() {\r\n    String folder = this.getTargetFolder();\r\n    if (!folder.isEmpty() &&\r\n        folder.charAt(folder.length() - 1) != File.separatorChar) {\r\n      folder = folder + File.separatorChar;\r\n    }\r\n\r\n    return folder + this.getTargetFileName();\r\n  }\r\n\r\n  @Override\r\n  public String toString() {\r\n    return String\r\n        .format(\"%s: source=%s, targetFolder=%s, targetName=%s\", this.getClass().getSimpleName(),\r\n            PreprocessorUtils.getFilePath(this.getSourceFile()), this.getTargetFolder(),\r\n            this.getTargetFileName());\r\n  }\r\n\r\n  public List<PreprocessingState.ExcludeIfInfo> processGlobalDirectives(\r\n      final PreprocessorContext context, final PreprocessingState stateInUse) throws IOException {\r\n    final PreprocessingState activeState =\r\n        stateInUse == null ? context.produceNewPreprocessingState(this, 0) : stateInUse;\r\n    activeState.setGlobalPhase(true);\r\n\r\n    String leftTrimmedString = null;\r\n    try {\r\n      try {\r\n        while (!Thread.currentThread().isInterrupted()) {\r\n          String nonTrimmedProcessingString = activeState.nextLine();\r\n\r\n          final Set<PreprocessingFlag> processFlags = activeState.getPreprocessingFlags();\r\n\r\n          if (processFlags.contains(PreprocessingFlag.END_PROCESSING) ||\r\n              processFlags.contains(PreprocessingFlag.ABORT_PROCESSING)) {\r\n            if (!processFlags.contains(PreprocessingFlag.ABORT_PROCESSING)) {\r\n              processFlags.remove(PreprocessingFlag.END_PROCESSING);\r\n            }\r\n            nonTrimmedProcessingString = null;\r\n          }\r\n\r\n          if (nonTrimmedProcessingString == null) {\r\n            activeState.popTextContainer();\r\n            if (activeState.isIncludeStackEmpty()) {\r\n              break;\r\n            } else {\r\n              continue;\r\n            }\r\n          }\r\n\r\n          leftTrimmedString = PreprocessorUtils.leftTrim(nonTrimmedProcessingString);\r\n\r\n          if (isHashPrefixed(leftTrimmedString, context)) {\r\n            switch (processDirective(context, activeState,\r\n                this.extractHashPrefixedDirective(leftTrimmedString, context))) {\r\n              case PROCESSED:\r\n              case READ_NEXT_LINE:\r\n              case SHOULD_BE_COMMENTED:\r\n                continue;\r\n              default:\r\n                throw new Error(\"Unsupported result\");\r\n            }\r\n          }\r\n        }\r\n      } catch (Exception unexpected) {\r\n        final PreprocessorException pp =\r\n            PreprocessorException.extractPreprocessorException(unexpected);\r\n        if (pp == null) {\r\n          throw activeState\r\n              .makeException(\"Unexpected exception detected\", leftTrimmedString, unexpected);\r\n        } else {\r\n          throw pp;\r\n        }\r\n      }\r\n      if (!activeState.isIfStackEmpty()) {\r\n        final TextFileDataContainer lastIf = requireNonNull(activeState.peekIf());\r\n        throw new PreprocessorException(\r\n            \"Unclosed \" + AbstractDirectiveHandler.DIRECTIVE_PREFIX + \"_if instruction detected\",\r\n            \"\", new FilePositionInfo[] {\r\n            new FilePositionInfo(lastIf.getFile(), lastIf.getNextStringIndex())}, null);\r\n      }\r\n\r\n      return activeState.popAllExcludeIfInfoData();\r\n    } finally {\r\n      activeState.setGlobalPhase(false);\r\n    }\r\n  }\r\n\r\n  private boolean isHashPrefixed(final String line, final PreprocessorContext context) {\r\n    final boolean allowedWhitespaces = context.isAllowWhitespaces();\r\n    final boolean result = isJcpDirectiveLine(line, allowedWhitespaces);\r\n    if (!allowedWhitespaces) {\r\n      if (context.getPreprocessingState().isGlobalPhase() && !result && line.startsWith(\"// \") &&\r\n          DIRECTIVE_HASH_PREFIXED.matcher(line).matches()) {\r\n        final TextFileDataContainer textContainer =\r\n            context.getPreprocessingState().getCurrentIncludeFileContainer();\r\n        String lineInfo = \"<NONE>\";\r\n        if (textContainer != null) {\r\n          lineInfo = String.format(\"%s:%d)\", textContainer.getFile().getAbsolutePath(),\r\n              textContainer.getNextStringIndex());\r\n        }\r\n        context.logWarning(WARNING_SPACE_BEFORE_HASH + lineInfo);\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private String extractHashPrefixedDirective(final String line,\r\n                                              final PreprocessorContext context) {\r\n    if (context.isAllowWhitespaces()) {\r\n      final Matcher matcher = DIRECTIVE_HASH_PREFIXED.matcher(line);\r\n      if (matcher.find()) {\r\n        return matcher.group(1);\r\n      } else {\r\n        throw new IllegalStateException(\r\n            \"Unexpected situation, directive is not found, contact developer! (\" + line + ')');\r\n      }\r\n    } else {\r\n      return PreprocessorUtils.extractTail(AbstractDirectiveHandler.DIRECTIVE_PREFIX, line);\r\n    }\r\n  }\r\n\r\n  private String extractDoubleDollarPrefixedDirective(\r\n      final String line,\r\n      final boolean block,\r\n      final PreprocessorContext context) {\r\n    String tail;\r\n    if (context.isAllowWhitespaces()) {\r\n      final Matcher matcher = block ? DIRECTIVE_TWO_DOLLARS_BLOCK_PREFIXED.matcher(line) :\r\n          DIRECTIVE_TWO_DOLLARS_PREFIXED.matcher(line);\r\n      if (matcher.find()) {\r\n        tail = matcher.group(1);\r\n      } else {\r\n        throw new IllegalStateException(\r\n            \"Unexpected situation, '//$$' directive is not found, contact developer! (\" + line +\r\n                ')');\r\n      }\r\n    } else {\r\n      if (block) {\r\n        tail = PreprocessorUtils.extractTail(\"//$$\\\"\\\"\\\"\", line);\r\n      } else {\r\n        tail = PreprocessorUtils.extractTail(\"//$$\", line);\r\n      }\r\n    }\r\n\r\n    if (context.isPreserveIndents()) {\r\n      tail = PreprocessorUtils.replacePartByChar(line, ' ', 0, line.length() - tail.length());\r\n    }\r\n    return tail;\r\n  }\r\n\r\n  private String extractSingleDollarPrefixedDirective(final String line,\r\n                                                      final boolean block,\r\n                                                      final PreprocessorContext context) {\r\n    String tail;\r\n    if (context.isAllowWhitespaces()) {\r\n      final Matcher matcher = block ? DIRECTIVE_SINGLE_DOLLAR_BLOCK_PREFIXED.matcher(line) :\r\n          DIRECTIVE_SINGLE_DOLLAR_PREFIXED.matcher(line);\r\n      if (matcher.find()) {\r\n        tail = matcher.group(1);\r\n      } else {\r\n        throw new IllegalStateException(\r\n            \"Unexpected situation, '//$' directive is not found, contact developer! (\" + line +\r\n                ')');\r\n      }\r\n    } else {\r\n      if (block) {\r\n        tail = PreprocessorUtils.extractTail(\"//$\\\"\\\"\\\"\", line);\r\n      } else {\r\n        tail = PreprocessorUtils.extractTail(\"//$\", line);\r\n      }\r\n    }\r\n\r\n    if (context.isPreserveIndents()) {\r\n      tail = PreprocessorUtils.replacePartByChar(line, ' ', 0, line.length() - tail.length());\r\n    }\r\n    return tail;\r\n  }\r\n\r\n  /**\r\n   * Preprocess the file described by the object, <b>NB! it doesn't clear local variables automatically for cloned contexts</b>\r\n   *\r\n   * @param context the preprocessor context, must not be null\r\n   * @return the state for the preprocessed file\r\n   * @throws IOException           it will be thrown for IO errors\r\n   * @throws PreprocessorException it will be thrown for violation of preprocessing logic, like undefined variable\r\n   * @see #preprocessFileWithNotification(PreprocessorContext, PreprocessingState, boolean)\r\n   * @since 7.3.0\r\n   */\r\n  public PreprocessingState preprocessFile(final PreprocessorContext context) throws IOException {\r\n    return this.preprocessFileWithNotification(context, context.getPreprocessingState(), true);\r\n  }\r\n\r\n  @SuppressWarnings(\"StringEquality\")\r\n  private void flushTextBufferForRemovedComments(\r\n      final PreprocessorContext context,\r\n      final AtomicReference<Map.Entry<String, String>> firstDetectedUncommentLinePtr,\r\n      final int stringIndex,\r\n      final List<String> textPieces,\r\n      final ResettablePrinter resettablePrinter) {\r\n\r\n    final Map.Entry<String, String> firstUncommentLine =\r\n        firstDetectedUncommentLinePtr.getAndSet(null);\r\n\r\n    final boolean lastEol = !textPieces.isEmpty() && textPieces.get(textPieces.size() - 1) ==\r\n        EOL_MARKER;\r\n    final String accumulated = (lastEol ? IntStream.range(0, textPieces.size() - 1) :\r\n        IntStream.range(0, textPieces.size()))\r\n        .mapToObj(textPieces::get)\r\n        .map(x -> (x == EOL_MARKER ? context.getEol() : x))\r\n        .collect(Collectors.joining());\r\n    textPieces.clear();\r\n\r\n    if (accumulated.isEmpty()) {\r\n      if (lastEol) {\r\n        resettablePrinter.print(context.getEol());\r\n      }\r\n    } else {\r\n      final List<CommentTextProcessor> processors = context.getCommentTextProcessors();\r\n      String text = accumulated;\r\n\r\n      if (!processors.isEmpty()) {\r\n        final FilePositionInfo filePositionInfo =\r\n            new FilePositionInfo(this.sourceFile, stringIndex);\r\n        final int indent = firstUncommentLine == null ? 0 : firstUncommentLine.getKey().length();\r\n\r\n        final List<String> results = processors\r\n            .stream()\r\n            .filter(x -> x.isAllowed(context))\r\n            .map(x -> {\r\n              try {\r\n                return x.processUncommentedText(\r\n                    context,\r\n                    indent,\r\n                    accumulated);\r\n              } catch (Exception ex) {\r\n                throw new PreprocessorException(\r\n                    \"Error during external comment text processor call: \" +\r\n                        x.getClass().getCanonicalName(),\r\n                    accumulated, context.getPreprocessingState().makeIncludeStack(), ex);\r\n              }\r\n            }).collect(Collectors.toList());\r\n\r\n        if (results.isEmpty()) {\r\n          context.logDebug(\"No any result from processors for text block at \" + filePositionInfo);\r\n          text = accumulated;\r\n        } else {\r\n          text = results.stream().collect(Collectors.joining(context.getEol()));\r\n        }\r\n      }\r\n      resettablePrinter.print(text + (lastEol ? context.getEol() : \"\"));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Preprocess the file described by the object, <b>NB! it doesn't clear local variables automatically for cloned contexts</b>\r\n   *\r\n   * @param context          the preprocessor context, must not be null\r\n   * @param stateInUse       initial preprocessing state, if it is null then it will be automatically created\r\n   * @param notifyProcessors send notification to all processors registered in context about start and stop,\r\n   *                         it should be true for direct call of preprocess of standalone file. <b>Works only for non-cloned contexts.</b>\r\n   * @return the state for the preprocessed file\r\n   * @throws IOException           it will be thrown for IO errors\r\n   * @throws PreprocessorException it will be thrown for violation of preprocessing logic, like undefined variable\r\n   * @since 7.3.0\r\n   */\r\n  public PreprocessingState preprocessFileWithNotification(\r\n      final PreprocessorContext context,\r\n      final PreprocessingState stateInUse,\r\n      final boolean notifyProcessors)\r\n      throws IOException {\r\n    if (!context.isCloned() && notifyProcessors) {\r\n      final List<PreprocessorContextAware> successfullyNotified = new ArrayList<>();\r\n      try {\r\n        context.fireNotificationStart(successfullyNotified);\r\n      } catch (final Exception ex) {\r\n        context.logError(\"Error during init of context aware processors: \" + ex.getMessage());\r\n        successfullyNotified.forEach(x -> {\r\n          try {\r\n            x.onContextStopped(context, ex);\r\n          } catch (Exception err) {\r\n            context.logError(\"Error: \" + err.getMessage());\r\n          }\r\n        });\r\n        throw new IllegalStateException(\"Exception during notification of context aware listeners\",\r\n            ex);\r\n      }\r\n    }\r\n\r\n    PreprocessingState state = null;\r\n    Throwable error = null;\r\n    try {\r\n      // do not clear local variables for cloned context to keep them in the new context\r\n      if (!context.isCloned()) {\r\n        context.clearLocalVariables();\r\n      }\r\n\r\n      if (stateInUse == null) {\r\n        state = context.produceNewPreprocessingState(this, 1);\r\n      } else {\r\n        state = stateInUse;\r\n      }\r\n\r\n      String leftTrimmedString = null;\r\n\r\n      TextFileDataContainer lastTextFileDataContainer = null;\r\n      final List<String> textPieces = new ArrayList<>();\r\n\r\n      Integer firstBlockLineIndex = null;\r\n      try {\r\n        final AtomicReference<Map.Entry<String, String>> firstUncommentLine =\r\n            new AtomicReference<>();\r\n\r\n        while (!Thread.currentThread().isInterrupted()) {\r\n          final ResettablePrinter thePrinter =\r\n              requireNonNull(state.getSelectedPrinter(), \"Printer must be defined\");\r\n\r\n          String rawString = state.nextLine();\r\n          final boolean presentedNextLine = state.hasReadLineNextLineInEnd();\r\n\r\n          final Set<PreprocessingFlag> processFlags = state.getPreprocessingFlags();\r\n\r\n          if (processFlags.contains(PreprocessingFlag.END_PROCESSING) ||\r\n              processFlags.contains(PreprocessingFlag.ABORT_PROCESSING)) {\r\n            if (!processFlags.contains(PreprocessingFlag.ABORT_PROCESSING)) {\r\n              processFlags.remove(PreprocessingFlag.END_PROCESSING);\r\n            }\r\n            rawString = null;\r\n          }\r\n\r\n          if (state.getPreprocessingFlags()\r\n              .contains(PreprocessingFlag.END_PROCESSING)) {\r\n            state.getPreprocessingFlags().remove(PreprocessingFlag.END_PROCESSING);\r\n            rawString = null;\r\n          }\r\n\r\n          if (rawString == null) {\r\n            this.flushTextBufferForRemovedComments(\r\n                context,\r\n                firstUncommentLine,\r\n                requireNonNullElse(firstBlockLineIndex, findLastReadStringIndexInStack(state)),\r\n                textPieces,\r\n                thePrinter);\r\n            firstBlockLineIndex = null;\r\n            lastTextFileDataContainer = state.popTextContainer();\r\n            if (state.isIncludeStackEmpty()) {\r\n              break;\r\n            } else {\r\n              continue;\r\n            }\r\n          }\r\n\r\n          leftTrimmedString = PreprocessorUtils.leftTrim(rawString);\r\n\r\n          final String stringPrefix;\r\n          if (leftTrimmedString.isEmpty()) {\r\n            stringPrefix = rawString;\r\n          } else {\r\n            final int numberOfSpacesAtTheLineBeginning = rawString.indexOf(leftTrimmedString);\r\n\r\n            if (numberOfSpacesAtTheLineBeginning > 0) {\r\n              stringPrefix = rawString.substring(0, numberOfSpacesAtTheLineBeginning);\r\n            } else {\r\n              stringPrefix = \"\";\r\n            }\r\n          }\r\n\r\n          String stringToBeProcessed = leftTrimmedString;\r\n          final boolean doPrintEol = presentedNextLine || !context.isCareForLastEol();\r\n\r\n          if (isHashPrefixed(stringToBeProcessed, context)) {\r\n            this.flushTextBufferForRemovedComments(\r\n                context,\r\n                firstUncommentLine,\r\n                requireNonNullElse(firstBlockLineIndex, findLastReadStringIndexInStack(state)),\r\n                textPieces,\r\n                thePrinter);\r\n            firstBlockLineIndex = null;\r\n            final String extractedDirective =\r\n                extractHashPrefixedDirective(stringToBeProcessed, context);\r\n            switch (this.processDirective(context, state, extractedDirective)) {\r\n              case PROCESSED:\r\n              case READ_NEXT_LINE: {\r\n                if (context.isKeepLines()) {\r\n                  final String text = stringPrefix +\r\n                      AbstractDirectiveHandler.PREFIX_FOR_KEEPING_LINES_PROCESSED_DIRECTIVES +\r\n                      extractedDirective;\r\n                  if (doPrintEol) {\r\n                    thePrinter.println(text, context.getEol());\r\n                  } else {\r\n                    thePrinter.print(text);\r\n                  }\r\n                }\r\n                continue;\r\n              }\r\n              case SHOULD_BE_COMMENTED: {\r\n                final String text = stringPrefix +\r\n                    AbstractDirectiveHandler.PREFIX_FOR_KEEPING_LINES_PROCESSED_DIRECTIVES +\r\n                    extractedDirective;\r\n                if (doPrintEol) {\r\n                  thePrinter.println(text, context.getEol());\r\n                } else {\r\n                  thePrinter.print(text);\r\n                }\r\n                continue;\r\n              }\r\n              default:\r\n                throw new IllegalStateException(\"Unsupported result\");\r\n            }\r\n          }\r\n\r\n          if (state.isDirectiveCanBeProcessed() &&\r\n              !state.getPreprocessingFlags()\r\n                  .contains(PreprocessingFlag.TEXT_OUTPUT_DISABLED)) {\r\n            final boolean startsWithTwoDollars =\r\n                isDoubleDollarPrefixed(leftTrimmedString, context.isAllowWhitespaces());\r\n\r\n            if (!startsWithTwoDollars) {\r\n              stringToBeProcessed = PreprocessorUtils.processMacroses(leftTrimmedString, context);\r\n            }\r\n\r\n            if (startsWithTwoDollars) {\r\n              // Output the tail of the string to the output stream without comments and macros\r\n              String text = extractDoubleDollarPrefixedDirective(leftTrimmedString, false, context);\r\n              Map.Entry<String, String> indentText =\r\n                  Map.entry(context.isPreserveIndents() ? stringPrefix : \"\", text);\r\n              final boolean firstLineSet = firstUncommentLine.compareAndSet(null, indentText);\r\n\r\n              if (context.isAllowsBlocks() &&\r\n                  isDoubleDollarBlockPrefixed(leftTrimmedString, context.isAllowWhitespaces())) {\r\n                text =\r\n                    extractDoubleDollarPrefixedDirective(leftTrimmedString, true, context);\r\n                indentText = Map.entry(context.isPreserveIndents() ? stringPrefix : \"\", text);\r\n\r\n                if (firstLineSet) {\r\n                  firstBlockLineIndex = findLastReadStringIndexInStack(state);\r\n                  firstUncommentLine.set(indentText);\r\n                }\r\n                textPieces.add(indentText.getValue());\r\n                if (doPrintEol) {\r\n                  textPieces.add(EOL_MARKER);\r\n                }\r\n              } else {\r\n                this.flushTextBufferForRemovedComments(\r\n                    context,\r\n                    firstUncommentLine,\r\n                    requireNonNullElse(firstBlockLineIndex, findLastReadStringIndexInStack(state)),\r\n                    textPieces,\r\n                    thePrinter);\r\n                firstBlockLineIndex = null;\r\n\r\n                textPieces.add(stringPrefix);\r\n                textPieces.add(indentText.getKey());\r\n                textPieces.add(indentText.getValue());\r\n                if (doPrintEol) {\r\n                  textPieces.add(EOL_MARKER);\r\n                }\r\n                this.flushTextBufferForRemovedComments(\r\n                    context,\r\n                    firstUncommentLine,\r\n                    requireNonNullElse(firstBlockLineIndex, findLastReadStringIndexInStack(state)),\r\n                    textPieces,\r\n                    thePrinter);\r\n                firstBlockLineIndex = null;\r\n              }\r\n            } else if (isSingleDollarPrefixed(stringToBeProcessed, context.isAllowWhitespaces())) {\r\n              // Output the tail of the string to the output stream without comments\r\n              String text =\r\n                  extractSingleDollarPrefixedDirective(stringToBeProcessed, false, context);\r\n              Map.Entry<String, String> indentText =\r\n                  Map.entry(context.isPreserveIndents() ? stringPrefix : \"\", text);\r\n              final boolean firstLineSet = firstUncommentLine.compareAndSet(null, indentText);\r\n\r\n              if (context.isAllowsBlocks() &&\r\n                  isDollarBlockPrefixed(stringToBeProcessed, context.isAllowWhitespaces())) {\r\n                text =\r\n                    extractSingleDollarPrefixedDirective(stringToBeProcessed, true, context);\r\n                indentText = Map.entry(context.isPreserveIndents() ? stringPrefix : \"\", text);\r\n\r\n                if (firstLineSet) {\r\n                  firstBlockLineIndex = findLastReadStringIndexInStack(state);\r\n                  firstUncommentLine.set(indentText);\r\n                }\r\n\r\n                textPieces.add(indentText.getValue());\r\n                if (doPrintEol) {\r\n                  textPieces.add(EOL_MARKER);\r\n                }\r\n              } else {\r\n                this.flushTextBufferForRemovedComments(\r\n                    context,\r\n                    firstUncommentLine,\r\n                    requireNonNullElse(firstBlockLineIndex, findLastReadStringIndexInStack(state)),\r\n                    textPieces,\r\n                    thePrinter);\r\n                firstBlockLineIndex = null;\r\n\r\n                textPieces.add(stringPrefix);\r\n                textPieces.add(indentText.getKey());\r\n                textPieces.add(indentText.getValue());\r\n\r\n                if (doPrintEol) {\r\n                  textPieces.add(EOL_MARKER);\r\n                }\r\n                this.flushTextBufferForRemovedComments(\r\n                    context,\r\n                    firstUncommentLine,\r\n                    requireNonNullElse(firstBlockLineIndex, findLastReadStringIndexInStack(state)),\r\n                    textPieces,\r\n                    thePrinter);\r\n                firstBlockLineIndex = null;\r\n              }\r\n            } else {\r\n              // Just string\r\n              this.flushTextBufferForRemovedComments(\r\n                  context,\r\n                  firstUncommentLine,\r\n                  requireNonNullElse(firstBlockLineIndex, findLastReadStringIndexInStack(state)),\r\n                  textPieces,\r\n                  thePrinter);\r\n              firstBlockLineIndex = null;\r\n\r\n              final String strToOut = findTailRemover(stringToBeProcessed, context);\r\n\r\n              if (state.getPreprocessingFlags()\r\n                  .contains(PreprocessingFlag.COMMENT_NEXT_LINE)) {\r\n                thePrinter.print(AbstractDirectiveHandler.ONE_LINE_COMMENT);\r\n                state.getPreprocessingFlags()\r\n                    .remove(PreprocessingFlag.COMMENT_NEXT_LINE);\r\n              }\r\n\r\n              thePrinter.print(stringPrefix);\r\n              if (doPrintEol) {\r\n                thePrinter.println(strToOut, context.getEol());\r\n              } else {\r\n                thePrinter.print(strToOut);\r\n              }\r\n            }\r\n          } else if (context.isKeepLines()) {\r\n            flushTextBufferForRemovedComments(context, firstUncommentLine,\r\n                requireNonNullElse(firstBlockLineIndex, findLastReadStringIndexInStack(state)),\r\n                textPieces,\r\n                thePrinter);\r\n            firstBlockLineIndex = null;\r\n\r\n            final String text = AbstractDirectiveHandler.PREFIX_FOR_KEEPING_LINES + rawString;\r\n            if (doPrintEol) {\r\n              thePrinter.println(text, context.getEol());\r\n            } else {\r\n              thePrinter.print(text);\r\n            }\r\n          }\r\n        }\r\n      } catch (Exception unexpected) {\r\n        final String message =\r\n            unexpected.getMessage() == null ? \"Unexpected exception\" : unexpected.getMessage();\r\n        throw state.makeException(message, leftTrimmedString, unexpected);\r\n      }\r\n\r\n      if (!state.isIfStackEmpty()) {\r\n        final TextFileDataContainer lastIf =\r\n            requireNonNull(state.peekIf(), \"'IF' stack is empty\");\r\n        throw new PreprocessorException(\r\n            \"Unclosed \" + AbstractDirectiveHandler.DIRECTIVE_PREFIX + \"if instruction detected\",\r\n            \"\", new FilePositionInfo[] {\r\n            new FilePositionInfo(lastIf.getFile(), lastIf.getNextStringIndex())}, null);\r\n      }\r\n      if (!state.isWhileStackEmpty()) {\r\n        final TextFileDataContainer lastWhile =\r\n            requireNonNull(state.peekWhile(), \"'WHILE' stack is empty\");\r\n        throw new PreprocessorException(\r\n            \"Unclosed \" + AbstractDirectiveHandler.DIRECTIVE_PREFIX + \"while instruction detected\",\r\n            \"\", new FilePositionInfo[] {\r\n            new FilePositionInfo(lastWhile.getFile(), lastWhile.getNextStringIndex())}, null);\r\n      }\r\n\r\n      if (!context.isDryRun() && requireNonNull(lastTextFileDataContainer).isAutoFlush()) {\r\n        final File outFile = context.createDestinationFileForPath(makeTargetFilePathAsString());\r\n\r\n        final boolean wasSaved =\r\n            state.saveBuffersToFile(outFile, context.getKeepComments());\r\n\r\n        if (context.isVerbose()) {\r\n          context.logForVerbose(String\r\n              .format(\"Content was %s into file '%s'\", (wasSaved ? \"saved\" : \"not saved\"),\r\n                  outFile));\r\n        }\r\n\r\n        if (this.sourceFile != null && context.isKeepAttributes() &&\r\n            !PreprocessorUtils.copyFileAttributes(this.getSourceFile(), outFile)) {\r\n          throw new IOException(\"Can't copy attributes in result file: \" + outFile);\r\n        }\r\n\r\n        this.getGeneratedResources().add(outFile);\r\n      }\r\n    } catch (Throwable ex) {\r\n      error = ex;\r\n      if (ex instanceof IOException) {\r\n        throw (IOException) ex;\r\n      }\r\n      if (ex instanceof Error) {\r\n        throw (Error) ex;\r\n      }\r\n      if (ex instanceof RuntimeException) {\r\n        throw (RuntimeException) ex;\r\n      }\r\n    } finally {\r\n      if (!context.isCloned() && notifyProcessors) {\r\n        context.fireNotificationStop(error);\r\n      }\r\n    }\r\n    return state;\r\n  }\r\n\r\n  private boolean checkDirectiveArgumentRoughly(final AbstractDirectiveHandler directive,\r\n                                                final String rest) {\r\n    final DirectiveArgumentType argument = directive.getArgumentType();\r\n\r\n    boolean result;\r\n    final String trimmedRest = rest.trim();\r\n\r\n    switch (argument) {\r\n      case NONE: {\r\n        result = trimmedRest.isEmpty();\r\n      }\r\n      break;\r\n      case ON_OFF: {\r\n        if (trimmedRest.isEmpty()) {\r\n          result = false;\r\n        } else {\r\n          final char firstChar = rest.charAt(0);\r\n          result = firstChar == '+' || firstChar == '-';\r\n          if (rest.length() > 1) {\r\n            result = result && Character.isSpaceChar(rest.charAt(1));\r\n          }\r\n        }\r\n      }\r\n      break;\r\n      case TAIL: {\r\n        result = true;\r\n      }\r\n      break;\r\n      default: {\r\n        result = !trimmedRest.isEmpty() && Character.isSpaceChar(rest.charAt(0));\r\n      }\r\n      break;\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n\r\n  private AfterDirectiveProcessingBehaviour processDirective(\r\n      final PreprocessorContext context,\r\n      final PreprocessingState stateInUse,\r\n      final String directiveString) {\r\n    final boolean executionEnabled = stateInUse.isDirectiveCanBeProcessed();\r\n    final boolean firstPass = stateInUse.isGlobalPhase();\r\n\r\n    for (final AbstractDirectiveHandler handler : context.getDirectiveHandlers()) {\r\n      final String name = handler.getName();\r\n      if (directiveString.startsWith(name)) {\r\n        if ((firstPass && !handler.isGlobalPhaseAllowed()) ||\r\n            (!firstPass && !handler.isPreprocessingPhaseAllowed())) {\r\n          return AfterDirectiveProcessingBehaviour.READ_NEXT_LINE;\r\n        }\r\n\r\n        final boolean allowedForExecution =\r\n            executionEnabled || !handler.executeOnlyWhenExecutionAllowed();\r\n\r\n        final String restOfString = PreprocessorUtils.extractTail(name, directiveString);\r\n        if (checkDirectiveArgumentRoughly(handler, restOfString)) {\r\n          if (allowedForExecution) {\r\n            return handler.execute(restOfString, context);\r\n          } else {\r\n            return context.isKeepLines() ? AfterDirectiveProcessingBehaviour.SHOULD_BE_COMMENTED :\r\n                AfterDirectiveProcessingBehaviour.PROCESSED;\r\n          }\r\n        } else {\r\n          throw context.makeException(\r\n              \"Detected bad argument for \" + AbstractDirectiveHandler.DIRECTIVE_PREFIX +\r\n                  handler.getName(), null);\r\n        }\r\n      }\r\n    }\r\n    throw context.makeException(\"Unknown preprocessor directive [\" + directiveString + ']', null);\r\n  }\r\n\r\n  public void setExcluded(final boolean flag) {\r\n    excludedFromPreprocessing = flag;\r\n  }\r\n}\r\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/containers/PreprocessingFlag.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.containers;\n\n/**\n * The enumeration contains flags describe inside special preprocessor states\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic enum PreprocessingFlag {\n\n  /**\n   * This flag shows that it is allowed to print texts into an output stream\n   */\n  TEXT_OUTPUT_DISABLED,\n  /**\n   * This flag shows that we must comment the next line (one time flag)\n   */\n  COMMENT_NEXT_LINE,\n  /**\n   * This flag shows that the current //#if construction in the passive state\n   */\n  IF_CONDITION_FALSE,\n  /**\n   * This flag shows that //#break has been met\n   */\n  BREAK_COMMAND,\n  /**\n   * This flag shows that preprocessing must be ended on the next string\n   */\n  END_PROCESSING,\n  /**\n   * This flag allows to stop preprocessing immediately\n   */\n  ABORT_PROCESSING\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/containers/TextFileDataContainer.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.containers;\n\nimport java.io.File;\nimport java.util.Objects;\n\n/**\n * The class contains text data of a file and the string position index for the file\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class TextFileDataContainer {\n\n  private final String[] text;\n  private final boolean fileEndedByNextLine;\n  private final File file;\n\n  /**\n   * Flag shows to save automatically buffers after file preprocessing end.\n   */\n  private boolean autoFlush = true;\n  private int nextStringIndex;\n\n  public TextFileDataContainer(final TextFileDataContainer item, final int stringIndex) {\n    this(item.file, item.text, item.fileEndedByNextLine, stringIndex);\n  }\n\n  public TextFileDataContainer(final File currentFile, final String[] text,\n                               final boolean fileEndedByNextLine, final int stringIndex) {\n    Objects.requireNonNull(currentFile, \"File is null\");\n    Objects.requireNonNull(text, \"Text is null\");\n    this.file = currentFile;\n    this.text = text;\n    setNextStringIndex(stringIndex);\n    this.fileEndedByNextLine = fileEndedByNextLine;\n  }\n\n  public void disableAutoFlush() {\n    this.autoFlush = false;\n  }\n\n  public boolean isAutoFlush() {\n    return this.autoFlush;\n  }\n\n\n  public String[] getText() {\n    return this.text.clone();\n  }\n\n\n  public File getFile() {\n    return this.file;\n  }\n\n  public void reset() {\n    this.nextStringIndex = 0;\n  }\n\n  public boolean isPresentedNextLineOnReadString() {\n    return this.nextStringIndex < this.text.length || fileEndedByNextLine;\n  }\n\n\n  public String nextLine() {\n    if (this.nextStringIndex >= this.text.length) {\n      return null;\n    } else {\n      return this.text[this.nextStringIndex++];\n    }\n  }\n\n  public int getLastReadStringIndex() {\n    return this.nextStringIndex - 1;\n  }\n\n  public int getNextStringIndex() {\n    return nextStringIndex;\n  }\n\n  public void setNextStringIndex(final int index) {\n    if (index < 0 || index >= text.length) {\n      throw new IndexOutOfBoundsException(\"String index out of bound [\" + index + ']');\n    }\n    this.nextStringIndex = index;\n  }\n\n  @Override\n  public int hashCode() {\n    return file.hashCode();\n  }\n\n  @Override\n  public boolean equals(final Object that) {\n    if (this == that) {\n      return true;\n    }\n\n    if (that instanceof TextFileDataContainer) {\n      final TextFileDataContainer thatItem = (TextFileDataContainer) that;\n      return file.equals(thatItem.file) && nextStringIndex == thatItem.nextStringIndex;\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/context/CommentRemoverType.java",
    "content": "package com.igormaznitsa.jcp.context;\n\nimport java.util.Arrays;\nimport java.util.stream.Collectors;\n\n/**\n * Type of comment remover.\n *\n * @since 7.1.0\n */\npublic enum CommentRemoverType {\n  /**\n   * To not remove comments.\n   */\n  KEEP_ALL,\n  /**\n   * Remove all single line and multiline comments defined in C style.\n   */\n  REMOVE_C_STYLE,\n  /**\n   * Remove only comments contain JCP directives.\n   */\n  REMOVE_JCP_ONLY;\n\n  /**\n   * Make comma separated list of enum item names.\n   *\n   * @return comma separated list of all enum items, without spaces.\n   */\n  public static String makeListOfAllRemoverIds() {\n    return Arrays.stream(CommentRemoverType.values())\n        .map(Enum::name).collect(Collectors.joining(\",\"));\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/context/CommentTextProcessor.java",
    "content": "package com.igormaznitsa.jcp.context;\n\n/**\n * A custom processor for detecting and handling uncommenting directives in source text.\n * This processor recognizes lines or blocks marked with `//$` and `//$$` and can either\n * return them unchanged or modify them as needed. It is invoked after the external text\n * is prepared for injection into the preprocessed source.\n * If block merging is enabled, consecutive lines beginning with `\"\"\"` will be merged\n * into a single text block, and the `\"\"\"` markers will be removed.\n *\n * @since 7.2.0\n */\npublic interface CommentTextProcessor extends PreprocessorContextAware, ExecutionAllowable {\n\n  /**\n   * Processes uncommented text detected in `//$` or `//$$` sections.\n   * If no transformation is needed, the original text must be returned unchanged.\n   *\n   * @param context           the current preprocessor context; must not be null\n   * @param recommendedIndent the suggested indentation level for the processed text, if any modifications are applied\n   * @param uncommentedText   the text that was uncommented and is subject to processing; must not be null\n   * @return the processed text, which may be unchanged or modified\n   * @since 7.3.0\n   */\n  String processUncommentedText(\n      PreprocessorContext context,\n      int recommendedIndent,\n      String uncommentedText);\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/context/EnvironmentVariableProcessor.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.context;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.Properties;\nimport java.util.Set;\n\n/**\n * The class allows to get access to environment variables from preprocessor\n * expression, the variables have the \"env.\" prefix and all them are String type\n * All environment variables are allowed for reading and disallowing for writing\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class EnvironmentVariableProcessor implements SpecialVariableProcessor {\n\n  private static final String PREFIX = \"env.\";\n  private final Map<String, Value> environmentVars;\n\n  public EnvironmentVariableProcessor() {\n    final Map<String, Value> env = new HashMap<>();\n\n    final Properties properties = System.getProperties();\n\n    for (final String key : properties.stringPropertyNames()) {\n      env.put(PREFIX + key.toLowerCase(Locale.ROOT).replace(' ', '_'),\n          Value.valueOf(properties.getProperty(key)));\n    }\n\n    environmentVars = Collections.unmodifiableMap(env);\n  }\n\n  @Override\n  public Set<String> getVariableNames() {\n    return environmentVars.keySet();\n  }\n\n  @Override\n  public Value getVariable(final String varName, final PreprocessorContext context) {\n    final Value result = environmentVars.get(varName);\n    if (result == null) {\n      throw context.makeException(\"Can't find in environment: \" + varName, null);\n    }\n    return result;\n  }\n\n  @Override\n  public void setVariable(final String varName, final Value value,\n                          final PreprocessorContext context) {\n    throw context.makeException(\"Illegal change of environment record '\" + varName +\n        \"'. Environment records accessible only for reading!\", null);\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/context/ExecutionAllowable.java",
    "content": "package com.igormaznitsa.jcp.context;\n\n/**\n * Interface describes an abstract object which can decide to be executed or not during execution in specified point.\n *\n * @since 7.3.0\n */\npublic interface ExecutionAllowable {\n\n  /**\n   * Indicates whether execution is allowed to run in the current context.\n   * This method is invoked before each call and receives complete\n   * information about the current context and source file, enabling it to make a\n   * dynamic decision.\n   * <b>If execution in bounds of test or mock state then some arguments can be null.</b>\n   *\n   * @param context the current preprocessor context; must not be null\n   * @return {@code true} if it is allowed to run; {@code false} otherwise\n   */\n  boolean isAllowed(\n      PreprocessorContext context\n  );\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/context/JCPSpecialVariableProcessor.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.context;\n\n\nimport com.igormaznitsa.jcp.InfoHelper;\nimport com.igormaznitsa.jcp.containers.TextFileDataContainer;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements the special variable processor interface and allows to get access to inside JCP variables Inside JCP variables have the \"jcp.\" prefix\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class JCPSpecialVariableProcessor implements SpecialVariableProcessor {\n\n  public static final String VAR_JCP_BUFFER_ALL = \"jcp.text.buffer.all\";\n  public static final String VAR_JCP_BUFFER_MIDDLE = \"jcp.text.buffer.middle\";\n  public static final String VAR_JCP_BUFFER_PREFIX = \"jcp.text.buffer.prefix\";\n  public static final String VAR_JCP_BUFFER_POSTFIX = \"jcp.text.buffer.postfix\";\n  public static final String VAR_DEST_DIR = \"jcp.dst.dir\";\n  public static final String VAR_VERSION = \"jcp.version\";\n  public static final String VAR_DEST_FILE_NAME = \"jcp.dst.name\";\n  public static final String VAR_DEST_FULLPATH = \"jcp.dst.path\";\n  public static final String VAR_SRC_FILE_NAME = \"jcp.src.name\";\n  public static final String VAR_SRC_FILE_NAME2 = \"__filename__\";\n  public static final String VAR_SRC_DIR = \"jcp.src.dir\";\n  public static final String VAR_SRC_DIR2 = \"__filefolder__\";\n  public static final String VAR_SRC_FULLPATH = \"jcp.src.path\";\n  public static final String VAR_SRC_FULLPATH2 = \"__file__\";\n  public static final String VAR_LINE = \"__line__\";\n  public static final String VAR_DATE = \"__date__\";\n  public static final String VAR_TIME = \"__time__\";\n  public static final String VAR_TIMESTAMP = \"__timestamp__\";\n\n  final SimpleDateFormat dateFormat = new SimpleDateFormat(\"MMM dd yyyy\");\n  final SimpleDateFormat timeFormat = new SimpleDateFormat(\"HH:mm:ss\");\n  final SimpleDateFormat timestampFormat = new SimpleDateFormat(\"EEE MMM dd HH:mm:ss yyyy\");\n\n\n  public static List<NameReferencePair> getReference() {\n    final List<NameReferencePair> result = new ArrayList<>();\n\n    result.add(new NameReferencePair(VAR_VERSION, \"Preprocessor version\"));\n    result\n        .add(new NameReferencePair(VAR_SRC_FULLPATH, \"Full path to preprocessing file, read only\"));\n    result.add(new NameReferencePair(VAR_SRC_FULLPATH2,\n        \"Synonym for '\" + VAR_SRC_FULLPATH + \"', read only\"));\n    result.add(new NameReferencePair(VAR_SRC_DIR, \"Preprocessing file folder, read only\"));\n    result.add(new NameReferencePair(VAR_SRC_DIR2, \"Synonym for '\" + VAR_SRC_DIR + \"', read only\"));\n    result.add(new NameReferencePair(VAR_SRC_FILE_NAME, \"Preprocessing file name, read only\"));\n    result.add(new NameReferencePair(VAR_SRC_FILE_NAME2,\n        \"Synonym for '\" + VAR_SRC_FILE_NAME + \"', read only\"));\n\n    result.add(new NameReferencePair(VAR_LINE, \"Number of preprocessing line, read only\"));\n    result.add(new NameReferencePair(VAR_DEST_FULLPATH, \"Full destination file path, read only\"));\n    result.add(new NameReferencePair(VAR_DEST_DIR, \"Destination folder, read-write\"));\n    result.add(new NameReferencePair(VAR_DEST_FILE_NAME, \"Destination file name, read-write\"));\n\n    result.add(new NameReferencePair(VAR_TIME, \"Time (HH:mm:ss)\"));\n    result.add(new NameReferencePair(VAR_DATE, \"Date (MMM dd yyyy)\"));\n    result.add(\n        new NameReferencePair(VAR_TIMESTAMP, \"Source file timestamp (EEE MMM dd HH:mm:ss yyyy)\"));\n\n    result.add(new NameReferencePair(VAR_JCP_BUFFER_ALL,\n        \"Whole current text buffer for preprocessing file\"));\n    result.add(new NameReferencePair(VAR_JCP_BUFFER_MIDDLE,\n        \"Current middle text buffer for preprocessing file\"));\n    result.add(new NameReferencePair(VAR_JCP_BUFFER_PREFIX,\n        \"Current prefix text buffer for preprocessing file\"));\n    result.add(new NameReferencePair(VAR_JCP_BUFFER_POSTFIX,\n        \"Current postfix text buffer for preprocessing file\"));\n\n    return result;\n  }\n\n  @Override\n  public Set<String> getVariableNames() {\n    return Set.of(\n        VAR_JCP_BUFFER_PREFIX,\n        VAR_JCP_BUFFER_MIDDLE,\n        VAR_JCP_BUFFER_POSTFIX,\n        VAR_JCP_BUFFER_ALL,\n        VAR_DEST_DIR,\n        VAR_DEST_FILE_NAME,\n        VAR_DEST_FULLPATH,\n        VAR_SRC_DIR,\n        VAR_SRC_DIR2,\n        VAR_SRC_FILE_NAME,\n        VAR_SRC_FILE_NAME2,\n        VAR_SRC_FULLPATH,\n        VAR_SRC_FULLPATH2,\n        VAR_VERSION,\n        VAR_LINE,\n        VAR_TIME,\n        VAR_TIMESTAMP,\n        VAR_DATE\n    );\n  }\n\n  @Override\n  public Value getVariable(final String varName, final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n\n    switch (varName) {\n      case VAR_JCP_BUFFER_ALL:\n        return Value.valueOf(context.getPreprocessingState().getCurrentText());\n      case VAR_JCP_BUFFER_POSTFIX:\n        return Value.valueOf(context.getPreprocessingState().findPrinter(\n            PreprocessingState.PrinterType.POSTFIX).getText());\n      case VAR_JCP_BUFFER_MIDDLE:\n        return Value.valueOf(context.getPreprocessingState().findPrinter(\n            PreprocessingState.PrinterType.NORMAL).getText());\n      case VAR_JCP_BUFFER_PREFIX:\n        return Value.valueOf(context.getPreprocessingState().findPrinter(\n            PreprocessingState.PrinterType.PREFIX).getText());\n      case VAR_DEST_DIR:\n        return Value.valueOf(state.getRootFileInfo().getTargetFolder());\n      case VAR_DEST_FILE_NAME:\n        return Value.valueOf(state.getRootFileInfo().getTargetFileName());\n      case VAR_DEST_FULLPATH:\n        return Value.valueOf(state.getRootFileInfo().makeTargetFilePathAsString());\n      case VAR_SRC_DIR:\n      case VAR_SRC_DIR2:\n        return Value.valueOf(state.getRootFileInfo().getSourceFile().getParent());\n      case VAR_SRC_FILE_NAME:\n      case VAR_SRC_FILE_NAME2:\n        return Value.valueOf(state.getRootFileInfo().getSourceFile().getName());\n      case VAR_SRC_FULLPATH:\n      case VAR_SRC_FULLPATH2:\n        return Value\n            .valueOf(PreprocessorUtils.getFilePath(state.getRootFileInfo().getSourceFile()));\n      case VAR_VERSION:\n        return Value.valueOf(InfoHelper.getVersion());\n      case VAR_TIME:\n        return Value.valueOf(timeFormat.format(new Date()));\n      case VAR_DATE:\n        return Value.valueOf(dateFormat.format(new Date()));\n      case VAR_TIMESTAMP:\n        final TextFileDataContainer filedata = state.peekIncludeStackFile();\n        final Value result;\n        if (filedata == null) {\n          result = Value.valueOf(\"<no file>\");\n        } else {\n          result =\n              Value.valueOf(timestampFormat.format(new Date(filedata.getFile().lastModified())));\n        }\n        return result;\n      case VAR_LINE:\n        final TextFileDataContainer currentFile = state.peekIncludeStackFile();\n        final long line;\n        if (currentFile == null) {\n          line = -1L;\n        } else {\n          line = currentFile.getLastReadStringIndex() + 1;\n        }\n        return Value.valueOf(line);\n      default:\n        final String text = \"Attempting to read unexpected special variable [\" + varName + ']';\n        throw context.makeException(text, null);\n    }\n  }\n\n  private void assertNotGlobalPhase(final String varName, final PreprocessorContext context) {\n    if (context.getPreprocessingState().isGlobalPhase()) {\n      throw context.makeException(\n          \"Variable '\" + varName + \"' is not allowed to set during global phase\", null);\n    }\n  }\n\n  @Override\n  public void setVariable(final String varName, final Value value,\n                          final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    switch (varName) {\n      case VAR_JCP_BUFFER_ALL: {\n        this.assertNotGlobalPhase(varName, context);\n        state.setBufferText(value.toString());\n      }\n      break;\n      case VAR_JCP_BUFFER_POSTFIX: {\n        this.assertNotGlobalPhase(varName, context);\n        state.setBufferText(value.toString(), PreprocessingState.PrinterType.POSTFIX);\n      }\n      break;\n      case VAR_JCP_BUFFER_MIDDLE: {\n        this.assertNotGlobalPhase(varName, context);\n        state.setBufferText(value.toString(), PreprocessingState.PrinterType.NORMAL);\n      }\n      break;\n      case VAR_JCP_BUFFER_PREFIX: {\n        this.assertNotGlobalPhase(varName, context);\n        state.setBufferText(value.toString(), PreprocessingState.PrinterType.PREFIX);\n      }\n      break;\n      case VAR_DEST_DIR:\n        if (value.getType() != ValueType.STRING) {\n          throw new IllegalArgumentException(\"Only STRING type allowed\");\n        }\n        state.getRootFileInfo().setTargetFolder(value.asString());\n        break;\n      case VAR_DEST_FILE_NAME:\n        if (value.getType() != ValueType.STRING) {\n          throw new IllegalArgumentException(\"Only STRING type allowed\");\n        }\n        state.getRootFileInfo().setTargetFileName(value.asString());\n        break;\n      case VAR_DEST_FULLPATH:\n      case VAR_SRC_DIR:\n      case VAR_SRC_DIR2:\n      case VAR_SRC_FILE_NAME:\n      case VAR_SRC_FILE_NAME2:\n      case VAR_SRC_FULLPATH:\n      case VAR_SRC_FULLPATH2:\n      case VAR_VERSION:\n      case VAR_LINE:\n      case VAR_TIME:\n      case VAR_TIMESTAMP:\n      case VAR_DATE: {\n        final String text = \"The variable '\" + varName + \"' can't be set directly\";\n        throw context.makeException(text, null);\n      }\n      default: {\n        final String text = \"Attempting to write unexpected special variable [\" + varName + ']';\n        throw context.makeException(text, null);\n      }\n    }\n  }\n\n  public static final class NameReferencePair {\n\n    private final String name;\n    private final String reference;\n\n    private NameReferencePair(final String name, final String reference) {\n      this.name = name;\n      this.reference = reference;\n    }\n\n\n    public String getName() {\n      return this.name;\n    }\n\n\n    public String getReference() {\n      return this.reference;\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/context/PreprocessingState.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.context;\n\nimport static com.igormaznitsa.jcp.removers.AbstractCommentRemover.makeCommentRemover;\nimport static com.igormaznitsa.jcp.utils.IOUtils.closeQuietly;\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.findActiveFileInfoContainer;\nimport static java.util.Objects.requireNonNull;\nimport static java.util.Objects.requireNonNullElse;\n\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.containers.TextFileDataContainer;\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport com.igormaznitsa.jcp.utils.ResettablePrinter;\nimport java.io.BufferedInputStream;\nimport java.io.BufferedOutputStream;\nimport java.io.BufferedWriter;\nimport java.io.ByteArrayInputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\nimport java.io.StringReader;\nimport java.io.StringWriter;\nimport java.io.Writer;\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.Files;\nimport java.util.ArrayList;\nimport java.util.EnumSet;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport org.apache.commons.io.FileUtils;\nimport org.apache.commons.io.IOUtils;\n\n/**\n * The class describes a preprocessor state also it contains inside buffers and save data on disk\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class PreprocessingState {\n\n  public static final FilePositionInfo[] EMPTY_STACK = new FilePositionInfo[0];\n\n  public static final int MAX_WRITE_BUFFER_SIZE = 65536;\n  public static final String FAKE_FILE_FOLDER = \"/fake_test_folder\";\n  public static final String FAKE_FILE_PATH = FAKE_FILE_FOLDER + \"/some_fake_file.txt\";\n  private final Charset globalInCharacterEncoding;\n  private final Charset globalOutCharacterEncoding;\n  private final TextFileDataContainer rootReference;\n  private final FileInfoContainer rootFileInfo;\n  private final LinkedList<TextFileDataContainer> whileStack = new LinkedList<>();\n  private final LinkedList<TextFileDataContainer> ifStack = new LinkedList<>();\n  private final LinkedList<TextFileDataContainer> includeStack = new LinkedList<>();\n  private final LinkedList<ExcludeIfInfo> deferredExcludeStack = new LinkedList<>();\n  private final ResettablePrinter prefixPrinter = new ResettablePrinter(1024);\n  private final ResettablePrinter postfixPrinter = new ResettablePrinter(64 * 1024);\n  private final ResettablePrinter normalPrinter = new ResettablePrinter(1024);\n  private final boolean overrideOnlyIfContentChanged;\n  private final EnumSet<PreprocessingFlag> preprocessingFlags =\n      EnumSet.noneOf(PreprocessingFlag.class);\n  private final PreprocessorContext context;\n  private final boolean mockMode;\n  private ResettablePrinter selectedPrinter;\n  private TextFileDataContainer activeIf;\n  private TextFileDataContainer activeWhile;\n  private String lastReadString;\n  private boolean globalPhase;\n\n  PreprocessingState(final PreprocessorContext context, final Charset inEncoding,\n                     final Charset outEncoding) {\n    this.mockMode = true;\n    this.globalInCharacterEncoding = requireNonNull(inEncoding);\n    this.globalOutCharacterEncoding = requireNonNull(outEncoding);\n    this.rootReference = null;\n    this.lastReadString = \"\";\n    this.rootFileInfo = new FileInfoContainer(new File(\"global\"), \"global\", true);\n    this.overrideOnlyIfContentChanged = true;\n    this.context = context;\n    init();\n  }\n\n  PreprocessingState(final PreprocessorContext context, final FileInfoContainer rootFile,\n                     final Charset inEncoding, final Charset outEncoding,\n                     final boolean overrideOnlyIfContentChanged) throws IOException {\n    this.mockMode = false;\n\n    this.context = context;\n\n    this.overrideOnlyIfContentChanged = overrideOnlyIfContentChanged;\n    this.globalInCharacterEncoding = requireNonNull(inEncoding);\n    this.globalOutCharacterEncoding = requireNonNull(outEncoding);\n\n    this.rootFileInfo = requireNonNull(rootFile, \"The root file is null\");\n    init();\n    rootReference = openFile(rootFile.getSourceFile());\n  }\n\n  PreprocessingState(final PreprocessorContext context, final FileInfoContainer rootFile,\n                     final TextFileDataContainer rootContainer, final Charset inEncoding,\n                     final Charset outEncoding, final boolean overrideOnlyIfContentChanged) {\n    this.mockMode = false;\n\n    this.context = context;\n\n    this.globalInCharacterEncoding = requireNonNull(inEncoding);\n    this.globalOutCharacterEncoding = requireNonNull(outEncoding);\n    this.overrideOnlyIfContentChanged = overrideOnlyIfContentChanged;\n\n    this.rootFileInfo = requireNonNull(rootFile, \"The root file is null\");\n    init();\n    rootReference = rootContainer;\n    includeStack.push(rootContainer);\n  }\n\n  public static PreprocessingState makeMock(final PreprocessorContext context) {\n    return new PreprocessingState(context, StandardCharsets.UTF_8, StandardCharsets.UTF_8);\n  }\n\n  public boolean isMockMode() {\n    return this.mockMode;\n  }\n\n  public boolean isGlobalPhase() {\n    return this.globalPhase;\n  }\n\n  public void setGlobalPhase(final boolean flag) {\n    this.globalPhase = flag;\n  }\n\n  public String getLastReadString() {\n    return this.lastReadString;\n  }\n\n  public void pushExcludeIfData(\n      final FileInfoContainer infoContainer,\n      final String excludeIfCondition,\n      final int stringIndex\n  ) {\n    requireNonNull(infoContainer, \"File info is null\");\n    requireNonNull(excludeIfCondition, \"Condition is null\");\n\n    if (stringIndex < 0) {\n      throw new IllegalArgumentException(\"Unexpected string index [\" + stringIndex + ']');\n    }\n\n    this.deferredExcludeStack.push(\n        new ExcludeIfInfo(infoContainer, excludeIfCondition, stringIndex));\n  }\n\n  public ResettablePrinter getSelectedPrinter() {\n    return this.selectedPrinter;\n  }\n\n  public List<ExcludeIfInfo> popAllExcludeIfInfoData() {\n    final List<ExcludeIfInfo> result = new ArrayList<>(deferredExcludeStack);\n    this.deferredExcludeStack.clear();\n    return result;\n  }\n\n\n  public ExcludeIfInfo popExcludeIfData() {\n    return this.deferredExcludeStack.pop();\n  }\n\n\n  public Set<PreprocessingFlag> getPreprocessingFlags() {\n    return this.preprocessingFlags;\n  }\n\n  public ResettablePrinter findPrinter(final PrinterType type) {\n    switch (requireNonNull(type, \"Type is null\")) {\n      case NORMAL:\n        return this.normalPrinter;\n      case POSTFIX:\n        return this.postfixPrinter;\n      case PREFIX:\n        return this.prefixPrinter;\n      default:\n        throw new IllegalArgumentException(\"Unsupported type detected [\" + type.name() + ']');\n    }\n  }\n\n  public void selectPrinter(final PrinterType type) {\n    switch (requireNonNull(type, \"Type is null\")) {\n      case NORMAL:\n        this.selectedPrinter = this.normalPrinter;\n        break;\n      case POSTFIX:\n        this.selectedPrinter = this.postfixPrinter;\n        break;\n      case PREFIX:\n        this.selectedPrinter = this.prefixPrinter;\n        break;\n      default:\n        throw new IllegalArgumentException(\"Unsupported type detected [\" + type.name() + ']');\n    }\n  }\n\n\n  public TextFileDataContainer getRootTextContainer() {\n    return this.rootReference;\n  }\n\n\n  public TextFileDataContainer openFile(final File file) throws IOException {\n    requireNonNull(file, \"The file is null\");\n\n    final AtomicBoolean endedByNextLineContainer = new AtomicBoolean();\n\n    final String[] texts = PreprocessorUtils\n        .readWholeTextFileIntoArray(file, globalInCharacterEncoding, endedByNextLineContainer);\n    final TextFileDataContainer newContainer =\n        new TextFileDataContainer(file, texts, endedByNextLineContainer.get(), 0);\n    includeStack.push(newContainer);\n    return newContainer;\n  }\n\n  public TextFileDataContainer peekIncludeStackFile() {\n    return this.includeStack.peek();\n  }\n\n  public List<TextFileDataContainer> getIncludeStack() {\n    return this.includeStack;\n  }\n\n  public Optional<TextFileDataContainer> findActiveTextFileDataContainer() {\n    if (this.isMockMode()) {\n      return Optional.of(\n          new TextFileDataContainer(new File(FAKE_FILE_PATH), new String[] {\"\"}, false, 0));\n    }\n    final TextFileDataContainer includeFile = this.peekIncludeStackFile();\n    return includeFile == null ? Optional.ofNullable(this.getRootTextContainer()) :\n        Optional.of(includeFile);\n  }\n\n  public Optional<FilePositionInfo> findFilePositionInfo() {\n    return this.findActiveTextFileDataContainer().map(\n        x -> new FilePositionInfo(x.getFile(), x.getLastReadStringIndex()));\n  }\n\n  public FilePositionInfo[] makeIncludeStack() {\n    if (this.isMockMode()) {\n      return EMPTY_STACK;\n    }\n\n    final FilePositionInfo[] stack = new FilePositionInfo[includeStack.size()];\n    for (int i = 0; i < includeStack.size(); i++) {\n      final TextFileDataContainer fileContainer = this.includeStack.get(i);\n      stack[i] =\n          new FilePositionInfo(fileContainer.getFile(), fileContainer.getLastReadStringIndex());\n    }\n    return stack;\n  }\n\n  public TextFileDataContainer getCurrentIncludeFileContainer() {\n    return this.includeStack.isEmpty() ? null : this.includeStack.get(this.includeStack.size() - 1);\n  }\n\n  public TextFileDataContainer popTextContainer() {\n    if (this.includeStack.isEmpty()) {\n      throw new IllegalStateException(\"Include stack is empty\");\n    }\n    return this.includeStack.pop();\n  }\n\n  public FileInfoContainer getRootFileInfo() {\n    return this.rootFileInfo;\n  }\n\n  public boolean isIncludeStackEmpty() {\n    return includeStack.isEmpty();\n  }\n\n  private TextFileDataContainer cloneTopTextDataContainer() {\n    final TextFileDataContainer topElement = requireNonNull(includeStack.peek());\n    return new TextFileDataContainer(topElement,\n        topElement.getLastReadStringIndex());\n  }\n\n\n  public PreprocessingState popWhile() {\n    final TextFileDataContainer whileOnTop = whileStack.pop();\n    if (whileOnTop == activeWhile) {\n      preprocessingFlags.remove(PreprocessingFlag.BREAK_COMMAND);\n      if (whileStack.isEmpty()) {\n        activeWhile = null;\n      } else {\n        activeWhile = whileStack.peek();\n      }\n    }\n    return this;\n  }\n\n\n  public PreprocessingState pushWhile(final boolean makeActive) {\n    final TextFileDataContainer whileRef = cloneTopTextDataContainer();\n    whileStack.push(whileRef);\n    if (makeActive) {\n      activeWhile = whileRef;\n    }\n    return this;\n  }\n\n\n  public TextFileDataContainer peekWhile() {\n    return whileStack.peek();\n  }\n\n  public boolean hasReadLineNextLineInEnd() {\n    return includeStack.peek().isPresentedNextLineOnReadString();\n  }\n\n\n  public String nextLine() {\n    final String result = includeStack.peek().nextLine();\n    this.lastReadString = result;\n    return result;\n  }\n\n\n  public PreprocessingState goToString(final int stringIndex) {\n    includeStack.peek().setNextStringIndex(stringIndex);\n    return this;\n  }\n\n\n  public PreprocessingState pushIf(final boolean makeActive) {\n    final TextFileDataContainer ifRef = cloneTopTextDataContainer();\n    ifStack.push(ifRef);\n    if (makeActive) {\n      activeIf = ifRef;\n    }\n    return this;\n  }\n\n  public void popAllIFUntilContainerWithFile(final TextFileDataContainer container) {\n    final File file = container.getFile();\n    final int stringIndex = container.getNextStringIndex();\n    while (!ifStack.isEmpty()) {\n      final TextFileDataContainer top = ifStack.peek();\n      if (!top.getFile().equals(file) || top.getNextStringIndex() <= stringIndex) {\n        break;\n      } else {\n        ifStack.pop();\n      }\n    }\n  }\n\n\n  public PreprocessingState popIf() {\n    final TextFileDataContainer ifRef = ifStack.pop();\n    if (ifRef == activeIf) {\n      if (ifStack.isEmpty()) {\n        activeIf = null;\n      } else {\n        activeIf = ifStack.peek();\n      }\n    }\n    return this;\n  }\n\n  public boolean isAtActiveWhile() {\n    if (whileStack.isEmpty()) {\n      return true;\n    } else {\n      return activeWhile == whileStack.peek();\n    }\n  }\n\n  public boolean isAtActiveIf() {\n    if (ifStack.isEmpty()) {\n      return true;\n    } else {\n      return ifStack.peek() == activeIf;\n    }\n  }\n\n  public boolean isDirectiveCanBeProcessedIgnoreBreak() {\n    return isAtActiveIf() && isAtActiveWhile() &&\n        !preprocessingFlags.contains(PreprocessingFlag.IF_CONDITION_FALSE);\n  }\n\n  public boolean isDirectiveCanBeProcessed() {\n    return isDirectiveCanBeProcessedIgnoreBreak() &&\n        !preprocessingFlags.contains(PreprocessingFlag.BREAK_COMMAND);\n  }\n\n\n  public TextFileDataContainer peekIf() {\n    return ifStack.peek();\n  }\n\n  public boolean isIfStackEmpty() {\n    return ifStack.isEmpty();\n  }\n\n  public boolean isWhileStackEmpty() {\n    return whileStack.isEmpty();\n  }\n\n  private void init() {\n    preprocessingFlags.clear();\n    resetPrinters();\n\n    selectPrinter(PrinterType.NORMAL);\n  }\n\n  public void resetPrinters() {\n    normalPrinter.reset();\n    prefixPrinter.reset();\n    postfixPrinter.reset();\n\n    selectedPrinter = normalPrinter;\n  }\n\n  public void setBufferText(final String text) {\n    this.prefixPrinter.reset();\n    this.normalPrinter.reset();\n    this.postfixPrinter.reset();\n    this.setBufferText(text, PrinterType.NORMAL);\n  }\n\n  public void setBufferText(final String text, final PrinterType printerType) {\n    switch (printerType) {\n      case NORMAL: {\n        this.normalPrinter.reset();\n        this.normalPrinter.print(requireNonNullElse(text, \"\"));\n      }\n      break;\n      case PREFIX: {\n        this.prefixPrinter.reset();\n        this.prefixPrinter.print(requireNonNullElse(text, \"\"));\n      }\n      break;\n      case POSTFIX: {\n        this.postfixPrinter.reset();\n        this.postfixPrinter.print(requireNonNullElse(text, \"\"));\n      }\n      break;\n      default:\n        throw new IllegalArgumentException(\"Unsupported printer type: \" + printerType);\n    }\n  }\n\n  public String getCurrentText() {\n    return this.prefixPrinter.getText()\n        + this.normalPrinter.getText()\n        + this.postfixPrinter.getText();\n  }\n\n  public void saveBuffersToStreams(final OutputStream prefix, final OutputStream normal,\n                                   final OutputStream postfix) throws IOException {\n    prefixPrinter.writeBufferTo(\n        new BufferedWriter(new OutputStreamWriter(prefix, globalOutCharacterEncoding)));\n    normalPrinter.writeBufferTo(\n        new BufferedWriter(new OutputStreamWriter(normal, globalOutCharacterEncoding)));\n    postfixPrinter.writeBufferTo(\n        new BufferedWriter(new OutputStreamWriter(postfix, globalOutCharacterEncoding)));\n  }\n\n  public boolean saveBuffersToFile(final File outFile, final CommentRemoverType keepComments)\n      throws IOException {\n    final File path = outFile.getParentFile();\n\n    if (path != null && !path.exists() && !path.mkdirs()) {\n      throw new IOException(\"Can't make directory [\" + PreprocessorUtils.getFilePath(path) + ']');\n    }\n\n    Writer writer = null;\n\n    boolean wasSaved = false;\n    try {\n      final int totatBufferedChars =\n          prefixPrinter.getSize() + normalPrinter.getSize() + postfixPrinter.getSize();\n      final int BUFFER_SIZE =\n          Math.max(64, Math.min(totatBufferedChars << 1, MAX_WRITE_BUFFER_SIZE));\n\n      if (this.overrideOnlyIfContentChanged) {\n        String content = writePrinterBuffers(new StringWriter(totatBufferedChars)).toString();\n        if (keepComments != CommentRemoverType.KEEP_ALL) {\n          content = makeCommentRemover(\n              keepComments,\n              new StringReader(content),\n              new StringWriter(totatBufferedChars),\n              context.isAllowWhitespaces()).process().toString();\n        }\n\n        boolean needWrite = true; // better write than not\n        final byte[] contentInBinaryForm = content.getBytes(globalOutCharacterEncoding);\n        if (outFile.isFile() && outFile.length() == contentInBinaryForm.length) {\n          // If file exists and has the same content, then skip overwriting it\n          try (InputStream currentFileInputStream = new BufferedInputStream(\n              Files.newInputStream(outFile.toPath()), Math.max(16384, (int) outFile.length()))) {\n            needWrite = !IOUtils.contentEquals(currentFileInputStream,\n                new ByteArrayInputStream(contentInBinaryForm));\n          }\n        }\n        if (needWrite) {\n          FileUtils.writeByteArrayToFile(outFile, contentInBinaryForm, false);\n          wasSaved = true;\n        } else {\n          this.context.logDebug(\n              \"Ignore writing data for \" + outFile + \" because its content has not been changed\");\n        }\n      } else if (keepComments != CommentRemoverType.KEEP_ALL) {\n        final String joinedBufferContent =\n            writePrinterBuffers(new StringWriter(totatBufferedChars)).toString();\n        writer = new OutputStreamWriter(\n            new BufferedOutputStream(new FileOutputStream(outFile, false), BUFFER_SIZE),\n            globalOutCharacterEncoding);\n        writer = makeCommentRemover(keepComments,\n            new StringReader(joinedBufferContent), writer, context.isAllowWhitespaces()).process();\n        wasSaved = true;\n      } else {\n        writer = new OutputStreamWriter(\n            new BufferedOutputStream(new FileOutputStream(outFile, false), BUFFER_SIZE),\n            globalOutCharacterEncoding);\n        writePrinterBuffers(writer);\n        wasSaved = true;\n      }\n    } finally {\n      closeQuietly(writer);\n    }\n\n    if (wasSaved) {\n      findActiveFileInfoContainer(context).ifPresent(t -> t.getGeneratedResources().add(outFile));\n      if (this.context.isKeepAttributes() && outFile.exists()) {\n        PreprocessorUtils.copyFileAttributes(this.getRootFileInfo().getSourceFile(), outFile);\n      }\n    }\n\n    return wasSaved;\n  }\n\n\n  public Writer writePrinterBuffers(final Writer writer) throws IOException {\n    if (!prefixPrinter.isEmpty()) {\n      prefixPrinter.writeBufferTo(writer);\n    }\n\n    if (!normalPrinter.isEmpty()) {\n      normalPrinter.writeBufferTo(writer);\n    }\n\n    if (!postfixPrinter.isEmpty()) {\n      postfixPrinter.writeBufferTo(writer);\n    }\n\n    return writer;\n  }\n\n\n  public PreprocessorException makeException(final String message, final String causeString,\n                                             final Throwable cause) {\n    return new PreprocessorException(message, causeString, makeIncludeStack(), cause);\n  }\n\n  public enum PrinterType {\n\n    NORMAL,\n    PREFIX,\n    POSTFIX\n  }\n\n  public static class ExcludeIfInfo {\n\n    private final FileInfoContainer fileInfoContainer;\n    private final String condition;\n    private final int stringIndex;\n\n    public ExcludeIfInfo(final FileInfoContainer fileInfoContainer, final String condition,\n                         final int stringIndex) {\n      this.fileInfoContainer = fileInfoContainer;\n      this.condition = condition.trim();\n      this.stringIndex = stringIndex;\n    }\n\n    public int getStringIndex() {\n      return this.stringIndex;\n    }\n\n\n    public FileInfoContainer getFileInfoContainer() {\n      return fileInfoContainer;\n    }\n\n\n    public String getCondition() {\n      return condition;\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/context/PreprocessorContext.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.context;\n\nimport static java.util.Collections.singletonList;\nimport static java.util.Objects.requireNonNull;\nimport static java.util.stream.Collectors.toUnmodifiableList;\n\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.containers.TextFileDataContainer;\nimport com.igormaznitsa.jcp.directives.AbstractDirectiveHandler;\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport com.igormaznitsa.jcp.logger.SystemOutLogger;\nimport com.igormaznitsa.jcp.utils.GetUtils;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.concurrent.atomic.AtomicReference;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport lombok.AccessLevel;\nimport lombok.Data;\nimport lombok.Getter;\nimport lombok.Setter;\nimport org.apache.commons.io.FilenameUtils;\n\n/**\n * Preprocessor context class is a main class which contains all options for preprocessin and allow to work with variables in expressions.\n */\n@Data\npublic class PreprocessorContext {\n\n  public static final List<String> DEFAULT_SOURCE_DIRECTORY =\n      Collections.singletonList(\".\" + File.separatorChar);\n  public static final String DEFAULT_DEST_DIRECTORY = \"..\" + File.separatorChar + \"preprocessed\";\n  public static final List<String> DEFAULT_PROCESSING_EXTENSIONS =\n      List.of(\"java\", \"txt\", \"htm\", \"html\");\n  public static final List<String> DEFAULT_EXCLUDED_EXTENSIONS = singletonList(\"xml\");\n  public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;\n  private static final List<AbstractDirectiveHandler> directiveHandlers =\n      AbstractDirectiveHandler.findAllDirectives();\n  @Setter(AccessLevel.NONE)\n  @Getter(AccessLevel.NONE)\n  protected final Collection<FileInfoContainer> preprocessedResources;\n  @Setter(AccessLevel.NONE)\n  @Getter(AccessLevel.NONE)\n  protected final AtomicReference<PreprocessingState> preprocessingState = new AtomicReference<>();\n  private final Map<String, Value> globalVarTable = new HashMap<>();\n  private final Map<String, Value> localVarTable = new HashMap<>();\n  private final Map<String, List<SpecialVariableProcessor>> mapVariableNameToSpecialVarProcessor =\n      new HashMap<>();\n  private final Map<String, Object> sharedResources = new HashMap<>();\n  private final List<File> configFiles = new ArrayList<>();\n  @Setter(AccessLevel.NONE)\n  private final boolean cloned;\n  @Setter(AccessLevel.NONE)\n  private final TextFileDataContainer currentInCloneSource;\n  private final List<SourceFolder> sources = new ArrayList<>();\n  private final File baseDir;\n  private final Collection<File> activatedConfigFiles;\n  private final List<CommentTextProcessor> commentTextProcessors;\n  private String eol = GetUtils\n      .ensureNonNull(System.getProperty(\"jcp.line.separator\", System.getProperty(\"line.separator\")),\n          \"\\n\");\n  private boolean verbose = false;\n  private CommentRemoverType keepComments = CommentRemoverType.KEEP_ALL;\n  private boolean clearTarget = false;\n  private boolean dryRun = false;\n  private boolean keepLines = false;\n  private boolean careForLastEol = false;\n  private boolean dontOverwriteSameContent = false;\n  private boolean allowWhitespaces = false;\n  private boolean preserveIndents = false;\n  private boolean keepAttributes = false;\n  private boolean unknownVariableAsFalse = false;\n  private boolean allowsBlocks = false;\n  private File target;\n  private Set<String> extensions = new HashSet<>(DEFAULT_PROCESSING_EXTENSIONS);\n  private Set<String> excludeExtensions = new HashSet<>(DEFAULT_EXCLUDED_EXTENSIONS);\n  private List<PreprocessorExtension> preprocessorExtensions = List.of();\n  private Charset sourceEncoding = DEFAULT_CHARSET;\n  private Charset targetEncoding = DEFAULT_CHARSET;\n  @Setter(AccessLevel.NONE)\n  private PreprocessorLogger preprocessorLogger = new SystemOutLogger();\n  private List<String> excludeFolders = new ArrayList<>();\n\n  /**\n   * Constructor\n   *\n   * @param baseDir the base folder for process, it must not be null\n   */\n  public PreprocessorContext(final File baseDir) {\n    this.preprocessedResources = new ArrayList<>();\n    this.activatedConfigFiles = new ArrayList<>();\n    this.baseDir = requireNonNull(baseDir, \"Base folder must not be null\");\n    this.setSources(DEFAULT_SOURCE_DIRECTORY).setTarget(new File(DEFAULT_DEST_DIRECTORY));\n    this.registerSpecialVariableProcessor(new JCPSpecialVariableProcessor());\n    this.registerSpecialVariableProcessor(new EnvironmentVariableProcessor());\n    this.cloned = false;\n    this.currentInCloneSource = null;\n    this.commentTextProcessors = new ArrayList<>();\n    this.preprocessingState\n        .set(this.makeNewPreprocessorState(this.sourceEncoding, this.targetEncoding));\n  }\n\n  /**\n   * Make clone of a preprocessor context but without cloning state.\n   *\n   * @param context the context to be cloned, must not be null.\n   */\n  public PreprocessorContext(final PreprocessorContext context) {\n    requireNonNull(context, \"Source context must not be null\");\n\n    this.activatedConfigFiles = context.activatedConfigFiles;\n    this.preprocessedResources = context.preprocessedResources;\n\n    this.baseDir = context.getBaseDir();\n    this.verbose = context.isVerbose();\n    this.keepComments = context.getKeepComments();\n    this.clearTarget = context.isClearTarget();\n    this.dryRun = context.isDryRun();\n    this.keepLines = context.isKeepLines();\n    this.allowWhitespaces = context.isAllowWhitespaces();\n    this.preserveIndents = context.isPreserveIndents();\n    this.sources.addAll(context.sources);\n    this.target = context.getTarget();\n    this.keepAttributes = context.isKeepAttributes();\n    this.careForLastEol = context.isCareForLastEol();\n\n    this.extensions.clear();\n    this.extensions.addAll(context.extensions);\n\n    this.excludeExtensions.clear();\n    this.excludeExtensions.addAll(context.excludeExtensions);\n\n    this.unknownVariableAsFalse = context.unknownVariableAsFalse;\n    this.allowsBlocks = context.allowsBlocks;\n\n    this.preprocessorExtensions = context.getPreprocessorExtensions();\n    this.sourceEncoding = context.getSourceEncoding();\n    this.targetEncoding = context.getTargetEncoding();\n    this.dontOverwriteSameContent = context.isDontOverwriteSameContent();\n    this.eol = context.getEol();\n\n    this.globalVarTable.clear();\n    this.globalVarTable.putAll(context.getGlobalVarTable());\n\n    this.localVarTable.clear();\n    this.localVarTable.putAll(context.getLocalVarTable());\n    this.excludeFolders = new ArrayList<>(context.getExcludeFolders());\n\n    this.mapVariableNameToSpecialVarProcessor\n        .putAll(context.getMapVariableNameToSpecialVarProcessor());\n    this.sharedResources.putAll(context.getSharedResources());\n\n    this.configFiles.clear();\n    this.configFiles.addAll(context.getConfigFiles());\n\n    this.preprocessingState.set(requireNonNull(context.getPreprocessingState()));\n    this.cloned = true;\n\n    this.preprocessorLogger = context.getPreprocessorLogger();\n\n    this.commentTextProcessors = new ArrayList<>(context.commentTextProcessors);\n    this.currentInCloneSource = context.getPreprocessingState().peekIncludeStackFile();\n  }\n\n  private static String makeStackView(\n      final TextFileDataContainer cloneSource,\n      final boolean cloned,\n      final List<TextFileDataContainer> list\n  ) {\n    if (list == null || list.isEmpty()) {\n      return \"\";\n    }\n    final StringBuilder builder = new StringBuilder();\n    int tab = 5;\n\n    builder.append(\" \".repeat(tab));\n\n    builder.append('{');\n    if (cloned) {\n      builder.append(cloneSource == null ? \"*No src info\" :\n          \"*\" + cloneSource.getFile().getName() + ':' + cloneSource.getNextStringIndex());\n    } else {\n      builder.append(\"File chain\");\n    }\n    builder.append('}');\n    tab += 5;\n\n    int fileIndex = 1;\n    for (int i = list.size() - 1; i >= 0; i--) {\n      final TextFileDataContainer cur = list.get(i);\n      builder.append('\\n');\n      builder.append(\" \".repeat(Math.max(0, tab)));\n      builder.append(\"└>\");\n      builder.append(fileIndex++).append(\". \");\n      builder.append(cur.getFile().getName()).append(':').append(cur.getLastReadStringIndex() + 1);\n      tab += 3;\n    }\n\n    return builder.toString();\n  }\n\n  private static Charset decodeCharset(final String charsetName) {\n    final String normalized = charsetName.trim();\n    if (Charset.isSupported(normalized)) {\n      return Charset.forName(normalized);\n    } else {\n      throw new IllegalArgumentException(\"Unsupported charset: \" + charsetName);\n    }\n  }\n\n  /**\n   * Add comment text processor.\n   *\n   * @param commentTextProcessor comment text processor, must not be null\n   * @since 7.2.0\n   */\n  public void addCommentTextProcessor(final CommentTextProcessor commentTextProcessor) {\n    this.commentTextProcessors.add(requireNonNull(commentTextProcessor));\n  }\n\n  /**\n   * Remove comment text processor.\n   *\n   * @param commentTextProcessor remove registered comment text processor.\n   * @since 7.2.0\n   */\n  public void removeCommentTextProcessor(final CommentTextProcessor commentTextProcessor) {\n    this.commentTextProcessors.remove(commentTextProcessor);\n  }\n\n  /**\n   * Get all directive handlers allowed for processing.\n   *\n   * @return list of direction handlers for the context\n   * @since 7.0.6\n   */\n  public List<AbstractDirectiveHandler> getDirectiveHandlers() {\n    return directiveHandlers;\n  }\n\n  public void addPreprocessedResource(final FileInfoContainer container) {\n    if (container != null) {\n      this.preprocessedResources.add(container);\n    }\n  }\n\n  public void addAllPreprocessedResources(final Collection<FileInfoContainer> containers) {\n    if (containers != null) {\n      this.preprocessedResources.addAll(containers);\n    }\n  }\n\n  public Set<FileInfoContainer> findPreprocessedResources() {\n    return new HashSet<>(this.preprocessedResources);\n  }\n\n  /**\n   * Send notification about context start to all registered listeners.\n   *\n   * @param initedList list accumulating successfully processed listeners, must not be immutable and must not be null\n   * @since 7.2.0\n   */\n  public void fireNotificationStart(final List<PreprocessorContextAware> initedList) {\n    this.getCommentTextProcessors().forEach(x -> {\n      x.onContextStarted(this);\n      initedList.add(x);\n    });\n    this.getMapVariableNameToSpecialVarProcessor()\n        .values().stream().flatMap(Collection::stream).forEach(x -> {\n          x.onContextStarted(this);\n          initedList.add(x);\n        });\n    this.getPreprocessorExtensions().forEach(x -> {\n      x.onContextStarted(this);\n      initedList.add(x);\n    });\n  }\n\n  /**\n   * Send notification about context stop to all registered listeners.\n   *\n   * @param error error to be detected during preprocess, can be null if no errors\n   * @since 7.2.0\n   */\n  public void fireNotificationStop(final Throwable error) {\n    this.getCommentTextProcessors().forEach(x -> x.onContextStopped(this, error));\n    this.getMapVariableNameToSpecialVarProcessor()\n        .values().stream().flatMap(Collection::stream)\n        .forEach(x -> x.onContextStopped(this, error));\n    this.getPreprocessorExtensions().forEach(x -> x.onContextStopped(this, error));\n  }\n\n  /**\n   * Find all files which have been used during preprocess, it includes configs, source files, copied files,\n   * generated files, included files and binary files used by functions. Excluded files are not added if\n   * they are not processed by included files.\n   *\n   * @return set of all input files, must not be null\n   * @since 7.0.3\n   */\n  public Set<File> findAllInputFiles() {\n    final Set<File> result = new HashSet<>(this.configFiles);\n    this.preprocessedResources.forEach(x -> {\n      result.addAll(x.getIncludedSources());\n      if (x.getSourceFile() != null &&\n          !(x.getIncludedSources().isEmpty() && x.isExcludedFromPreprocessing())) {\n        result.add(x.getSourceFile());\n      }\n    });\n    return result;\n  }\n\n  /**\n   * Find all files which have been produced during preprocess, it includes also copied an generated files.\n   *\n   * @return set of all produced files, must not be null\n   * @since 7.0.3\n   */\n  public Set<File> findAllProducedFiles() {\n    return this.preprocessedResources.stream()\n        .flatMap(x -> x.getGeneratedResources().stream())\n        .collect(Collectors.toSet());\n  }\n\n  public Optional<FileInfoContainer> findFileInfoContainer(final File file) {\n    if (file == null) {\n      return Optional.empty();\n    } else {\n      return this.preprocessedResources.stream()\n          .filter(x -> file.equals(x.getSourceFile()))\n          .findFirst();\n    }\n  }\n\n  public void setEol(final String eol) {\n    this.eol = requireNonNull(eol);\n  }\n\n  public void setTarget(final File file) {\n    this.target = file.isAbsolute() ? file : new File(this.getBaseDir(), file.getPath());\n  }\n\n  public List<PreprocessorExtension> getPreprocessorExtensions() {\n    return this.preprocessorExtensions;\n  }\n\n  public void setPreprocessorExtensions(final List<PreprocessorExtension> extensions) {\n    if (extensions == null) {\n      this.logDebug(\"Removed all preprocessor extensions\");\n      this.preprocessorExtensions = List.of();\n    } else {\n      this.preprocessorExtensions =\n          extensions.stream().filter(Objects::nonNull).collect(toUnmodifiableList());\n      this.logDebug(\n          () -> \"Replaces preprocessor extensions: \" + this.preprocessorExtensions.stream()\n              .map(x -> x.getClass().getCanonicalName())\n              .collect(Collectors.joining(\",\")));\n    }\n  }\n\n  public void addPreprocessorExtension(final PreprocessorExtension extension) {\n    if (extension == null) {\n      return;\n    }\n    if (this.preprocessorExtensions.stream().anyMatch(x -> x == extension)) {\n      return;\n    }\n    this.preprocessorExtensions =\n        Stream.concat(this.preprocessorExtensions.stream(), Stream.of(extension)).collect(\n            toUnmodifiableList());\n    this.logDebug(\"Added preprocessor extension: \" + extension.getClass().getCanonicalName());\n  }\n\n  /**\n   * Check that the preprocessor context is a clone of another context.\n   *\n   * @return true if the context is a clone, false otherwise\n   */\n  public boolean isCloned() {\n    return this.cloned;\n  }\n\n  /**\n   * Set the logger to print information and error messages\n   *\n   * @param logger a logger to be used for output, it can be null\n   */\n  public void setPreprocessorLogger(final PreprocessorLogger logger) {\n    preprocessorLogger = logger;\n  }\n\n  /**\n   * It allows to register a special variable processor which can process some special global variables\n   *\n   * @param processor a variable processor to be registered, it must not be null\n   * @see SpecialVariableProcessor\n   */\n  public void registerSpecialVariableProcessor(final SpecialVariableProcessor processor) {\n    requireNonNull(processor, \"Processor is null\");\n\n    for (final String varName : processor.getVariableNames()) {\n      requireNonNull(varName, \"A Special Var name is null\");\n      if (mapVariableNameToSpecialVarProcessor.containsKey(varName)) {\n        throw new IllegalStateException(\"There is already defined processor for \" + varName);\n      }\n      mapVariableNameToSpecialVarProcessor.compute(varName,\n          (k, l) -> l == null ? List.of(processor) :\n              Stream.concat(l.stream(), Stream.of(processor)).collect(toUnmodifiableList()));\n    }\n  }\n\n  /**\n   * Print an information into the current log\n   *\n   * @param text a String to be printed into the information log, it can be null\n   */\n  public void logInfo(final String text) {\n    if (text != null && this.preprocessorLogger != null) {\n      this.preprocessorLogger.info(text);\n    }\n  }\n\n  /**\n   * Print an information about an error into the current log\n   *\n   * @param text a String to be printed into the error log, it can be null\n   */\n  public void logError(final String text) {\n    if (text != null && this.preprocessorLogger != null) {\n      this.preprocessorLogger.error(text);\n    }\n  }\n\n  /**\n   * Print some debug info into the current log\n   *\n   * @param text a String to be printed into the error log, it can be null\n   * @since 6.0.1\n   */\n  public void logDebug(final String text) {\n    if (text != null && this.preprocessorLogger != null) {\n      this.preprocessorLogger.debug(text);\n    }\n  }\n\n  /**\n   * Print some debug info into the current log\n   *\n   * @param textSupplier a String supplier to generate text to be printed into the debug log, it can be null\n   * @since 7.3.0\n   */\n  public void logDebug(final Supplier<String> textSupplier) {\n    if (textSupplier != null && this.preprocessorLogger != null) {\n      this.preprocessorLogger.debug(textSupplier);\n    }\n  }\n\n  /**\n   * Print an information about a warning situation into the current log\n   *\n   * @param text a String to be printed into the warning log, it can be null\n   */\n  public void logWarning(final String text) {\n    if (text != null || this.preprocessorLogger != null) {\n      this.preprocessorLogger.warning(text);\n    }\n  }\n\n  /**\n   * Set a shared source, it is an object saved into the internal map for a name\n   *\n   * @param name the name for the saved project, must not be null\n   * @param obj  the object to be saved in, must not be null\n   */\n  public void setSharedResource(final String name, final Object obj) {\n    requireNonNull(name, \"Name is null\");\n    requireNonNull(obj, \"Object is null\");\n\n    sharedResources.put(name, obj);\n  }\n\n  /**\n   * Get a shared source from internal map\n   *\n   * @param name the name of the needed object, it must not be null\n   * @return a cached object or null if it is not found\n   */\n\n  public Object getSharedResource(final String name) {\n    requireNonNull(name, \"Name is null\");\n    return sharedResources.get(name);\n  }\n\n  /**\n   * Remove a shared object from the internal map for its name\n   *\n   * @param name the object name, it must not be null\n   * @return removing object or null if it is not found\n   */\n  public Object removeSharedResource(final String name) {\n    requireNonNull(name, \"Name is null\");\n    return sharedResources.remove(name);\n  }\n\n  /**\n   * Set source directories\n   *\n   * @param folderPaths list of source folder paths represented as strings\n   * @return this preprocessor context instance\n   */\n  public PreprocessorContext setSources(final List<String> folderPaths) {\n    this.sources.clear();\n    this.sources.addAll(\n        folderPaths.stream().map(x -> new SourceFolder(this.baseDir, x))\n            .collect(Collectors.toList()));\n    return this;\n  }\n\n  /**\n   * Get file extensions of files to be preprocessed as a string array\n   *\n   * @return a string array of file extensions to be preprocessed\n   */\n  public Set<String> getExtensions() {\n    return this.extensions;\n  }\n\n  /**\n   * Set file extensions of files to be preprocessed, it is a comma separated list\n   *\n   * @param extensions comma separated extensions list of file extensions to be preprocessed, must not be null\n   * @return this preprocessor context\n   */\n  public PreprocessorContext setExtensions(final List<String> extensions) {\n    this.extensions = new HashSet<>(requireNonNull(extensions));\n    return this;\n  }\n\n  /**\n   * Check that a file is allowed to be preprocessed fo its extension\n   *\n   * @param file a file to be checked\n   * @return true if the file is allowed, false otherwise\n   */\n  public final boolean isFileAllowedForPreprocessing(final File file) {\n    boolean result = false;\n    if (file != null && file.isFile() && file.length() != 0L) {\n      result = this.extensions.contains(PreprocessorUtils.getFileExtension(file));\n    }\n    return result;\n  }\n\n  /**\n   * Check that a file is excluded from preprocessing and coping actions\n   *\n   * @param file a file to be checked\n   * @return true if th file must be excluded, otherwise false\n   */\n  public final boolean isFileExcludedByExtension(final File file) {\n    return file == null || !file.isFile() ||\n        this.excludeExtensions.contains(PreprocessorUtils.getFileExtension(file));\n  }\n\n  /**\n   * Get excluded file extension list as a string array\n   *\n   * @return a string array contains file extensions to be excluded from preprocessing act\n   */\n  public Set<String> getExcludeExtensions() {\n    return this.excludeExtensions;\n  }\n\n  /**\n   * Set comma separated list of file extensions to be excluded from preprocessing\n   *\n   * @param extensions a comma separated file extension list, it must not be null\n   * @return this preprocessor context\n   */\n  public PreprocessorContext setExcludeExtensions(\n      final List<String> extensions) {\n    this.excludeExtensions = new HashSet<>(requireNonNull(extensions));\n    return this;\n  }\n\n  /**\n   * Set a local variable value\n   *\n   * @param name  the variable name, must not be null, remember that the name will be normalized and will be entirely in lower case\n   * @param value the value for the variable, it must not be null\n   * @return this preprocessor context\n   * @see Value\n   */\n  public PreprocessorContext setLocalVariable(final String name, final Value value) {\n    requireNonNull(name, \"Variable name is null\");\n    requireNonNull(value, \"Value is null\");\n\n    final String normalized = requireNonNull(PreprocessorUtils.normalizeVariableName(name));\n\n    if (normalized.isEmpty()) {\n      throw makeException(\"Not defined variable name\", null);\n    }\n\n    if (this.mapVariableNameToSpecialVarProcessor.containsKey(normalized)) {\n      final SpecialVariableProcessor enabledProcessor =\n          findAllowedSpecialVariableProcessor(normalized)\n              .orElseThrow(() -> this.makeException(\"Set of local variable '\" + normalized +\n                  \"' is not allowed in the point by its processor\", null));\n      enabledProcessor.setVariable(normalized, value, this);\n    } else if (this.globalVarTable.containsKey(normalized)) {\n      throw makeException(\n          \"Cannot override global variable with a local variable of the same name [\" +\n              normalized + ']', null);\n    } else {\n      this.localVarTable.put(normalized, value);\n    }\n    return this;\n  }\n\n  /**\n   * Remove a local variable value from the context.\n   *\n   * @param name the variable name, must not be null, remember that the name will be normalized and will be entirely in lower case\n   * @return this preprocessor context\n   * @see Value\n   */\n  public PreprocessorContext removeLocalVariable(final String name) {\n    requireNonNull(name, \"Variable name is null\");\n    final String normalized = requireNonNull(PreprocessorUtils.normalizeVariableName(name));\n\n    if (normalized.isEmpty()) {\n      throw makeException(\"Empty variable name\", null);\n    }\n\n    if (mapVariableNameToSpecialVarProcessor.containsKey(normalized) ||\n        globalVarTable.containsKey(normalized)) {\n      throw makeException(\n          \"Attempting to remove either a global variable or a special variable as a local one [\" +\n              normalized + ']', null);\n    }\n\n    if (isVerbose()) {\n      logForVerbose(\"Removing local variable '\" + normalized + \"'\");\n    }\n    localVarTable.remove(normalized);\n    return this;\n  }\n\n  /**\n   * Remove a global variable value from the context.\n   *\n   * @param name the variable name, must not be null, remember that the name will be normalized and will be entirely in lower case\n   * @return this preprocessor context\n   * @see Value\n   */\n  public PreprocessorContext removeGlobalVariable(final String name) {\n    requireNonNull(name, \"Variable name is null\");\n\n    final String normalized = requireNonNull(PreprocessorUtils.normalizeVariableName(name));\n\n    if (normalized.isEmpty()) {\n      throw makeException(\"Empty variable name\", null);\n    }\n\n    if (mapVariableNameToSpecialVarProcessor.containsKey(normalized)) {\n      throw makeException(\n          \"Attempting to remove a special variable as a global one [\" + normalized + ']', null);\n    }\n\n    if (isVerbose()) {\n      logForVerbose(\"Removing global variable '\" + normalized + \"'\");\n    }\n\n    globalVarTable.remove(normalized);\n    return this;\n  }\n\n  /**\n   * Get a local variable value\n   *\n   * @param name the name for the variable, it can be null. The name will be normalized to allowed one.\n   * @return null either if the name is null or the variable is not found, otherwise its value\n   */\n  public Value getLocalVariable(final String name) {\n    if (name == null) {\n      return null;\n    }\n\n    final String normalized = requireNonNull(PreprocessorUtils.normalizeVariableName(name));\n\n    if (normalized.isEmpty()) {\n      return null;\n    }\n\n    return localVarTable.get(normalized);\n  }\n\n  /**\n   * Check that a local variable for a name is presented\n   *\n   * @param name the checking name, it will be normalized to the support format and can be null\n   * @return false either if the name is null or there is not any local variable for the name, otherwise true\n   */\n  public boolean containsLocalVariable(final String name) {\n    if (name == null) {\n      return false;\n    }\n\n    final String normalized = requireNonNull(PreprocessorUtils.normalizeVariableName(name));\n\n    if (normalized.isEmpty()) {\n      return false;\n    }\n\n    return localVarTable.containsKey(normalized);\n  }\n\n  /**\n   * Remove all local variables from the internal storage\n   *\n   * @return this preprocessor context\n   */\n  public PreprocessorContext clearLocalVariables() {\n    this.localVarTable.clear();\n    return this;\n  }\n\n  private Optional<SpecialVariableProcessor> findAllowedSpecialVariableProcessor(\n      final String normalizedName) {\n    return this.mapVariableNameToSpecialVarProcessor.get(normalizedName)\n        .stream()\n        .filter(x -> x.isAllowed(this)).findFirst();\n  }\n\n  /**\n   * Set a global variable value\n   *\n   * @param name  the variable name, it must not be null and will be normalized to the supported format\n   * @param value the variable value, it must not be null\n   * @return this preprocessor context\n   */\n  public PreprocessorContext setGlobalVariable(final String name, final Value value) {\n    requireNonNull(name, \"Variable name is null\");\n\n    final String normalizedName =\n        requireNonNull(PreprocessorUtils.normalizeVariableName(name));\n\n    if (normalizedName.isEmpty()) {\n      throw makeException(\"Name is empty\", null);\n    }\n\n    requireNonNull(value, \"Value is null\");\n\n    if (this.mapVariableNameToSpecialVarProcessor.containsKey(normalizedName)) {\n      final SpecialVariableProcessor firstActiveProcessor =\n          this.findAllowedSpecialVariableProcessor(normalizedName)\n              .orElseThrow(() -> this.makeException(\n                  \"Cannot set special variable '\" + normalizedName +\n                      \"' no valid processor available here, may be it is read only\",\n                  null));\n      firstActiveProcessor.setVariable(normalizedName, value, this);\n    } else {\n      if (isVerbose()) {\n        final String valueAsStr = value.toString();\n        if (globalVarTable.containsKey(normalizedName)) {\n          logForVerbose(\"Replacing global variable [\" + normalizedName + '=' + valueAsStr + ']');\n        } else {\n          logForVerbose(\"Defining new global variable [\" + normalizedName + '=' + valueAsStr + ']');\n        }\n      }\n      globalVarTable.put(normalizedName, value);\n    }\n    return this;\n  }\n\n  /**\n   * Check that there is a named global variable in the internal storage\n   *\n   * @param name the checking name, it will be normalized to the supported format, it can be null\n   * @return true if such variable is presented for its name in the internal storage, otherwise false (also it is false if the name is null)\n   */\n  public boolean containsGlobalVariable(final String name) {\n    if (name == null) {\n      return false;\n    }\n\n    final String normalized = requireNonNull(PreprocessorUtils.normalizeVariableName(name));\n    if (normalized.isEmpty()) {\n      return false;\n    }\n\n    return mapVariableNameToSpecialVarProcessor.containsKey(normalized) ||\n        globalVarTable.containsKey(normalized);\n  }\n\n  /**\n   * Find value among local and global variables for a name. It finds in the order: special processors, local variables, global variables\n   *\n   * @param name                    the name for the needed variable, it will be normalized to the supported format\n   * @param enforceUnknownVarAsNull if true then state of the unknownVariableAsFalse flag in context will be ignored\n   * @return null if either the variable is not found or the name is null, otherwise the variable value\n   */\n  public Value findVariableForName(final String name, final boolean enforceUnknownVarAsNull) {\n    if (name == null) {\n      return null;\n    }\n\n    final String normalized = requireNonNull(PreprocessorUtils.normalizeVariableName(name));\n\n    if (normalized.isEmpty()) {\n      return null;\n    }\n\n    final SpecialVariableProcessor processor =\n        mapVariableNameToSpecialVarProcessor.containsKey(normalized) ?\n            mapVariableNameToSpecialVarProcessor.get(normalized).\n                stream().filter(x -> x.isAllowed(this)).findFirst().orElse(null) : null;\n\n    if (processor != null) {\n      return processor.getVariable(normalized, this);\n    }\n\n    final Value val = getLocalVariable(normalized);\n    if (val != null) {\n      return val;\n    }\n\n    Value result = globalVarTable.get(normalized);\n\n    if (result == null && !enforceUnknownVarAsNull && this.unknownVariableAsFalse) {\n      logDebug(\"Unknown variable '\" + name + \"' is replaced by FALSE!\");\n      result = Value.BOOLEAN_FALSE;\n    }\n\n    return result;\n  }\n\n  /**\n   * Check that there is a global variable with such name.\n   *\n   * @param variableName a name to be checked, can be null\n   * @return false if there is not such variable or it is null, true if such global or special variable exists\n   */\n  public boolean isGlobalVariable(final String variableName) {\n    boolean result = false;\n    if (variableName != null) {\n      final String normalized = PreprocessorUtils.normalizeVariableName(variableName);\n      result = this.globalVarTable.containsKey(normalized) ||\n          mapVariableNameToSpecialVarProcessor.containsKey(normalized);\n    }\n    return result;\n  }\n\n  /**\n   * Check that there is a local variable with such name.\n   *\n   * @param variableName a name to be checked, can be null\n   * @return false if there is not such variable or it is null, true if such local variable exists\n   */\n  public boolean isLocalVariable(final String variableName) {\n    boolean result = false;\n    if (variableName != null) {\n      final String normalized = PreprocessorUtils.normalizeVariableName(variableName);\n      result = this.localVarTable.containsKey(normalized);\n    }\n    return result;\n  }\n\n  /**\n   * It allows to create a File object for its path subject to the destination directory path\n   *\n   * @param path the path to the file, it must not be null\n   * @return a generated File object for the path\n   */\n  public File createDestinationFileForPath(final String path) {\n    requireNonNull(path, \"Path is null\");\n\n    if (path.isEmpty()) {\n      throw makeException(\"File name is empty\", null);\n    }\n\n    return new File(this.getTarget(), path);\n  }\n\n  /**\n   * Ensure that the file is in the project folder hierarchy.\n   *\n   * @param file the file to be checked\n   * @return true if there is no info about hierarchy or the file in the hierarchy, false if the file is outbounds\n   * @since 7.2.1\n   */\n  public boolean isFileInBaseDir(final File file) {\n    final String normalizedPath =\n        FilenameUtils.normalizeNoEndSeparator(file.getAbsolutePath());\n    return normalizedPath.startsWith(\n        FilenameUtils.normalizeNoEndSeparator(this.baseDir.getAbsolutePath()));\n  }\n\n  /**\n   * It finds file among source folders, the file can be found only among source folders and\n   * any outside place is disabled for security purposes.\n   *\n   * @param path the file path to find, it must not be null and must be existing file\n   * @return found existing file object for the path, must not be null\n   */\n  public File findFileInSources(final String path) {\n    return this.findFileInSources(path, true);\n  }\n\n  /**\n   * It finds file among source folders, the file can be found only among source folders and\n   * any outside place is disabled for security purposes.\n   *\n   * @param path      the file path to find, it must not be null and must be existing file\n   * @param mustExist if true then the file must exist, false otherwise\n   * @return created file object for the path\n   * @since 7.2.1\n   */\n  public File findFileInSources(final String path, final boolean mustExist) {\n    if (path == null) {\n      throw makeException(\"File path is null\", null);\n    }\n\n    if (path.trim().isEmpty()) {\n      throw makeException(\"File path is empty\", null);\n    }\n\n    File result = null;\n\n    final TextFileDataContainer theFile = this.getPreprocessingState().peekIncludeStackFile();\n    final String parentDir = theFile == null ? null : theFile.getFile().getParent();\n\n    final File resultFile = new File(path);\n    if (resultFile.isAbsolute()) {\n      // absolute path\n\n      // check that the file is a child of a preprocessing source root else usage of the file is prohibited\n      final String normalizedPath =\n          FilenameUtils.normalizeNoEndSeparator(resultFile.getAbsolutePath());\n      for (final SourceFolder root : getSources()) {\n        if (normalizedPath.startsWith(root.getNormalizedAbsolutePath(true))) {\n          result = resultFile;\n          break;\n        }\n      }\n\n      if (result == null) {\n        throw makeException(\"Can't find file for path '\" + path +\n                \"' in preprocessing source folders, allowed usage only files in preprocessing source folders!\",\n            null);\n      } else if (!result.isFile()) {\n        throw makeException(\"File '\" + result + \"' is either not found or not a file\", null);\n      }\n\n    } else if (parentDir != null) {\n      // relative path\n      result = new File(parentDir, path);\n    } else {\n      final List<File> setOfFoundFiles = new ArrayList<>();\n      getSources().stream().map((root) -> new File(root.getAsFile(), path))\n          .filter((variant) -> (variant.exists() && variant.isFile())).forEachOrdered(\n              setOfFoundFiles::add);\n\n      if (setOfFoundFiles.size() == 1) {\n        result = setOfFoundFiles.get(0);\n      } else if (setOfFoundFiles.isEmpty()) {\n        result = null;\n      } else {\n        throw makeException(\n            \"Found several variants for path '\" + path + \"' in different source roots\", null);\n      }\n\n      if (result == null) {\n        throw makeException(\"Can't find file for path '\" + path +\n            \"' among source files registered for preprocessing.\", null);\n      } else if (mustExist && !result.isFile()) {\n        throw makeException(\"File '\" + PreprocessorUtils.getFilePath(result) +\n            \"' is either not found or not a file\", null);\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Add a configuration file, it is a file which contains directives and global variable definitions\n   *\n   * @param file a file, it must not be null\n   */\n  public void registerConfigFile(final File file) {\n    requireNonNull(file, \"File is null\");\n    this.configFiles.add(file.isAbsolute() ? file : new File(this.getBaseDir(), file.getPath()));\n  }\n\n  /**\n   * Generate new preprocessing state object, also the new preprocessing state will be saved as the current one in the context\n   *\n   * @param fileContainer a file container which will be using the preprocessor state, it must not be null\n   * @param phaseIndex    index of phase (0 - global, 1 - preprocessing)\n   * @return new generated preprocessor state\n   * @throws IOException it will be throws if there is any error in opening and reading operations\n   */\n  public PreprocessingState produceNewPreprocessingState(final FileInfoContainer fileContainer,\n                                                         final int phaseIndex) throws IOException {\n    requireNonNull(fileContainer, \"File container is null\");\n\n    if (verbose) {\n      if (phaseIndex == 0) {\n        logInfo(\"Start search global definitions in '\" +\n            PreprocessorUtils.getFilePath(fileContainer.getSourceFile()) + '\\'');\n      } else {\n        logInfo(\n            \"Start preprocessing '\" + PreprocessorUtils.getFilePath(fileContainer.getSourceFile()) +\n                '\\'');\n      }\n    }\n\n    this.preprocessingState.set(this.makeNewPreprocessorState(fileContainer));\n    return this.getPreprocessingState();\n  }\n\n  protected PreprocessingState makeNewPreprocessorState(final Charset sourceEncoding,\n                                                        final Charset targetEncoding) {\n    return new PreprocessingState(this, sourceEncoding, targetEncoding);\n  }\n\n  protected PreprocessingState makeNewPreprocessorState(final FileInfoContainer fileContainer)\n      throws IOException {\n    return new PreprocessingState(\n        this,\n        fileContainer,\n        getSourceEncoding(),\n        getTargetEncoding(),\n        this.isDontOverwriteSameContent()\n    );\n  }\n\n  protected PreprocessingState makeNewPreprocessorState(final FileInfoContainer fileContainer,\n                                                        final TextFileDataContainer textFileDataContainer) {\n    return new PreprocessingState(\n        this,\n        fileContainer,\n        textFileDataContainer,\n        this.getSourceEncoding(),\n        this.getTargetEncoding(),\n        this.isDontOverwriteSameContent()\n    );\n  }\n\n  /**\n   * Generate new preprocessing state for a file container and a text container, also the new preprocessing state will be saved as the current one in the context\n   *\n   * @param fileContainer the file container to be used to create the new preprocessing state, it must not be null\n   * @param textContainer the text container to be used to create the new preprocessing state, it must not be null\n   * @return new generated preprocessing state\n   */\n  public PreprocessingState produceNewPreprocessingState(final FileInfoContainer fileContainer,\n                                                         final TextFileDataContainer textContainer) {\n    this.preprocessingState.set(\n        this.makeNewPreprocessorState(fileContainer, textContainer));\n    return this.getPreprocessingState();\n  }\n\n  /**\n   * Get the last generated preprocessing state, it is the current one\n   *\n   * @return the last generated preprocessing state\n   */\n  public PreprocessingState getPreprocessingState() {\n    return this.preprocessingState.get();\n  }\n\n  /**\n   * Prepare exception with message and cause, or return cause if it is a preprocessor exception\n   *\n   * @param text  the message text, must not be null\n   * @param cause the cause, it can be null\n   * @return prepared exception with additional information\n   */\n  public PreprocessorException makeException(final String text, final Throwable cause) {\n    if (cause instanceof PreprocessorException) {\n      return (PreprocessorException) cause;\n    }\n\n    final FilePositionInfo[] includeStack;\n    final String sourceLine;\n    includeStack = this.getPreprocessingState().makeIncludeStack();\n    sourceLine = this.getPreprocessingState().getLastReadString();\n    return new PreprocessorException(text, sourceLine, includeStack, cause);\n  }\n\n  public void logForVerbose(final String str) {\n    if (isVerbose()) {\n      final String stack;\n      stack = makeStackView(this.currentInCloneSource, this.cloned,\n          this.getPreprocessingState().getIncludeStack());\n      this.logInfo(str + (stack.isEmpty() ? ' ' : '\\n') + stack);\n    }\n  }\n\n  public final static class SourceFolder {\n    private final String path;\n    private final File pathFile;\n\n    public SourceFolder(final File baseDir, final String path) {\n      this.path = requireNonNull(path);\n      final File pathAsFile = new File(path);\n      this.pathFile = pathAsFile.isAbsolute() ? pathAsFile : new File(baseDir, path);\n    }\n\n    public String getAsString() {\n      return this.path;\n    }\n\n    public File getAsFile() {\n      return this.pathFile;\n    }\n\n    public String getNormalizedAbsolutePath(final boolean separatorCharEnded) {\n      String result = FilenameUtils.normalizeNoEndSeparator(this.pathFile.getAbsolutePath());\n      if (separatorCharEnded) {\n        result += File.separatorChar;\n      }\n      return result;\n    }\n\n    @Override\n    public String toString() {\n      return String.format(\"%s[%s]\", this.getClass().getSimpleName(), this.path);\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/context/PreprocessorContextAware.java",
    "content": "package com.igormaznitsa.jcp.context;\n\n/**\n * Listener for preprocessor context work states.\n *\n * @since 7.3.0\n */\npublic interface PreprocessorContextAware {\n  /**\n   * Called when context started.\n   *\n   * @param context the source context, must not be null\n   */\n  default void onContextStarted(PreprocessorContext context) {\n\n  }\n\n  /**\n   * Called when context work ended.\n   *\n   * @param context the source context, must not be null\n   * @param error   the error if it was thrown during context execution.\n   */\n  default void onContextStopped(PreprocessorContext context, Throwable error) {\n\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/context/SpecialVariableProcessor.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.context;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport java.util.Set;\n\n/**\n * The interface describes a special variable processor which will be called for\n * variables met by a preprocessor in expressions\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic interface SpecialVariableProcessor extends PreprocessorContextAware,\n    ExecutionAllowable {\n\n  /**\n   * Get all variable names allowed by the processor as an array, all names must\n   * be in lower case\n   *\n   * @return allowed variable names as a String array\n   */\n  Set<String> getVariableNames();\n\n  @Override\n  default boolean isAllowed(PreprocessorContext context) {\n    return true;\n  }\n\n  /**\n   * Get the value for the variable\n   *\n   * @param varName the variable name, must not be null\n   * @param context the preprocessor context, it can be null\n   * @return the value, it must not return null because it will notified\n   * preprocessor that it supports the variable\n   */\n  Value getVariable(String varName, PreprocessorContext context);\n\n  /**\n   * Set a value to the variable\n   *\n   * @param varName the variable name, must not be null\n   * @param value   the value to be set to the variable, must not be null\n   * @param context the preprocessor context, it can be null\n   */\n  void setVariable(String varName, Value value, PreprocessorContext context);\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/AbortDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\n\n/**\n * The class implements the //#abort directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class AbortDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"abort\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"abort preprocessing and print message (macros allowed)\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.TAIL;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String rawTail,\n                                                   final PreprocessorContext context) {\n    final String normal =\n        (!rawTail.isEmpty() && Character.isSpaceChar(rawTail.charAt(0))) ? rawTail.substring(1) :\n            rawTail;\n    final String message = \"ABORT: \" + PreprocessorUtils.processMacroses(normal, context);\n    if (context.isVerbose()) {\n      context.logForVerbose(message);\n    } else {\n      context.logInfo(message);\n    }\n    context.getPreprocessingState().getPreprocessingFlags().add(PreprocessingFlag.ABORT_PROCESSING);\n    return AfterDirectiveProcessingBehaviour.READ_NEXT_LINE;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/AbstractDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * The class is the abstract parent for all classes process preprocessor\n * directives\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic abstract class AbstractDirectiveHandler {\n\n  /**\n   * The common preprocessor prefix for all directives\n   */\n  public static final String DIRECTIVE_PREFIX = \"//#\";\n\n  /**\n   * The prefix for lines to be kept by preprocessor\n   */\n  public static final String PREFIX_FOR_KEEPING_LINES = \"//JCP> \";\n\n  /**\n   * The prefix for lines to be kept by preprocessor, which contain processed\n   * directives\n   */\n  public static final String PREFIX_FOR_KEEPING_LINES_PROCESSED_DIRECTIVES = \"//JCP! \";\n\n  /**\n   * The prefix for one line comment\n   */\n  public static final String ONE_LINE_COMMENT = \"//\";\n\n  public static List<AbstractDirectiveHandler> findAllDirectives() {\n    final List<AbstractDirectiveHandler> result = new ArrayList<>();\n    result.add(new LocalDirectiveHandler());\n    result.add(new IfDefinedDirectiveHandler());\n    result.add(new IfNDefDirectiveHandler());\n    result.add(new IfDefDirectiveHandler());\n    result.add(new IfDirectiveHandler());\n    result.add(new ElseDirectiveHandler());\n    result.add(new EndIfDirectiveHandler());\n    result.add(new WhileDirectiveHandler());\n    result.add(new BreakDirectiveHandler());\n    result.add(new ContinueDirectiveHandler());\n    result.add(new EndDirectiveHandler());\n    result.add(new ExitIfDirectiveHandler());\n    result.add(new ExitDirectiveHandler());\n    result.add(new OutdirDirectiveHandler());\n    result.add(new OutEnabledDirectiveHandler());\n    result.add(new OutNameDirectiveHandler());\n    result.add(new OutDisabledDirectiveHandler());\n    result.add(new CommentNextLineDirectiveHandler());\n    result.add(new DefinelDirectiveHandler());\n    result.add(new DefineDirectiveHandler());\n    result.add(new UndefDirectiveHandler());\n    result.add(new FlushDirectiveHandler());\n    result.add(new IncludeDirectiveHandler());\n    result.add(new ActionDirectiveHandler());\n    result.add(new PostfixDirectiveHandler());\n    result.add(new PrefixDirectiveHandler());\n    result.add(new GlobalDirectiveHandler());\n    result.add(new GlobalElseDirectiveHandler());\n    result.add(new GlobalEndIfDirectiveHandler());\n    result.add(new GlobalIfDirectiveHandler());\n    result.add(new ExcludeIfDirectiveHandler());\n    result.add(new ErrorDirectiveHandler());\n    result.add(new WarningDirectiveHandler());\n    result.add(new EchoDirectiveHandler());\n    result.add(new MsgDirectiveHandler());\n    result.add(new NoAutoFlushHandler());\n    result.add(new AbortDirectiveHandler());\n    return result;\n  }\n\n  /**\n   * Get the name of the directive without prefix\n   *\n   * @return the directive name, must not be null\n   */\n\n  public abstract String getName();\n\n  /**\n   * Get the directive reference, it will be printed for a help request\n   *\n   * @return the directive reference as a String, must not be null\n   */\n\n  public abstract String getReference();\n\n  /**\n   * Get the directive name with prefix\n   *\n   * @return the full directive name (it including prefix)\n   */\n\n  public String getFullName() {\n    return DIRECTIVE_PREFIX + getName();\n  }\n\n  /**\n   * Get the argument type needed by the directive\n   *\n   * @return the argument type needed by the directive, it can't be null\n   */\n\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.NONE;\n  }\n\n  /**\n   * Execute directive\n   *\n   * @param tailString the tail of the string where the directive has been met, must not be null but can be empty\n   * @param context    the preprocessor context\n   * @return the needed preprocessor behavior, must not be null\n   */\n\n  public abstract AfterDirectiveProcessingBehaviour execute(String tailString,\n                                                            PreprocessorContext context);\n\n  /**\n   * Shows that the directive can be executed only when the preprocessing n\n   * active state i.e. if it is in active block //#if..//#endif of //#while\n   *\n   * @return true if the directive can be executed only if it is in active\n   * block, else the directive will be called in any case\n   */\n  public boolean executeOnlyWhenExecutionAllowed() {\n    return true;\n  }\n\n  /**\n   * Shows that the directive can be executed during a global preprocessing\n   * phase\n   *\n   * @return true if the directive allows the global directive phase, false if\n   * the directive must be ignored during that phase\n   */\n  public boolean isGlobalPhaseAllowed() {\n    return false;\n  }\n\n  /**\n   * Shows that the directive can be executed during the second preprocessing\n   * phase\n   *\n   * @return true uf the directive can be executed during the second\n   * preprocessing phase else false if the directive must be ignored\n   */\n  public boolean isPreprocessingPhaseAllowed() {\n    return true;\n  }\n\n  /**\n   * Check that the directive is deprecated one and can be removed in a next release\n   *\n   * @return true if the directive is deprecated, false otherwise\n   */\n  public boolean isDeprecated() {\n    return false;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/ActionDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.ExpressionItem;\nimport com.igormaznitsa.jcp.expression.ExpressionParser;\nimport com.igormaznitsa.jcp.expression.ExpressionTree;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport java.io.IOException;\nimport java.io.PushbackReader;\nimport java.io.StringReader;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n * The class implements the //#action directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ActionDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"action\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"call extension action with args\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.MULTI_EXPRESSION;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final List<PreprocessorExtension> extensions = context.getPreprocessorExtensions();\n\n    if (extensions.isEmpty()) {\n      throw context.makeException(\n          \"Detected action directive but there is no any provided action preprocessor extension to process it [\" +\n              string + ']',\n          null);\n    }\n\n    try {\n      final List<ExpressionTree> args = parseString(string, context);\n      final PreprocessorExtension extension = extensions.stream()\n          .filter(x -> x.isAllowed(context))\n          .filter(x -> x.hasAction(args.size()))\n          .findFirst().orElse(null);\n\n      if (extension == null) {\n        throw context.makeException(\n            \"Can't find any preprocessor extension to process action: \" + string,\n            null);\n      }\n\n      if (!extension.processAction(context,\n          args.stream().map(x -> Expression.evalTree(x, context)).collect(\n              Collectors.toList()))) {\n        throw context.makeException(\"Unable to process an action\", null);\n      }\n    } catch (IOException ex) {\n      throw context.makeException(\"Unexpected string detected [\" + string + ']', ex);\n    }\n\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n\n\n  private List<ExpressionTree> parseString(final String str, final PreprocessorContext context)\n      throws IOException {\n    final ExpressionParser parser = ExpressionParser.getInstance();\n\n    final PushbackReader reader = new PushbackReader(new StringReader(str));\n    final List<ExpressionTree> result = new ArrayList<>();\n\n    final PreprocessingState state = context.getPreprocessingState();\n    final FilePositionInfo[] stack;\n    final String sources;\n    stack = state.makeIncludeStack();\n    sources = state.getLastReadString();\n\n    while (!Thread.currentThread().isInterrupted()) {\n      final ExpressionTree tree;\n      tree = new ExpressionTree(stack, sources);\n      final ExpressionItem delimiter = parser.readExpression(reader, tree, context, false, true);\n\n      if (delimiter != null && ExpressionParser.SpecialItem.COMMA != delimiter) {\n        throw context.makeException(\"Wrong argument format detected\", null);\n      }\n\n      if (tree.isEmpty()) {\n        if (delimiter == null) {\n          break;\n        } else {\n          throw context.makeException(\"Empty argument\", null);\n        }\n      } else {\n        result.add(tree);\n        if (delimiter == null) {\n          break;\n        }\n      }\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/AfterDirectiveProcessingBehaviour.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\n/**\n * The enumeration contains flags after directive processing behavior\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic enum AfterDirectiveProcessingBehaviour {\n\n  /**\n   * Notify preprocessor that a directive has been processed successfully\n   */\n  PROCESSED,\n  /**\n   * Notify preprocessor that a directive has been processed and need to read\n   * the next line immediately\n   */\n  READ_NEXT_LINE,\n  /**\n   * Notify preprocessor that the directive has not been processed\n   */\n  NOT_PROCESSED,\n  /**\n   * Notify preprocessor that the line should be commented\n   */\n  SHOULD_BE_COMMENTED\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/BreakDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.Objects;\n\n/**\n * The class implements the //#break directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class BreakDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"break\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"break from \" + DIRECTIVE_PREFIX + \"while...\" + DIRECTIVE_PREFIX + \"end loop\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = Objects.requireNonNull(context.getPreprocessingState());\n\n    if (state.isWhileStackEmpty()) {\n      throw context\n          .makeException(\"Detected \" + getFullName() + \" without \" + DIRECTIVE_PREFIX + \"while\",\n              null);\n    }\n\n    state.getPreprocessingFlags().add(PreprocessingFlag.BREAK_COMMAND);\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/CommentNextLineDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#// directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class CommentNextLineDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"//\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"comment line after\";\n  }\n\n  @Override\n\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    context.getPreprocessingState().getPreprocessingFlags()\n        .add(PreprocessingFlag.COMMENT_NEXT_LINE);\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/ContinueDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.TextFileDataContainer;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.Objects;\n\n/**\n * The class implements the //#continue directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ContinueDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"continue\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"skip to next\" + DIRECTIVE_PREFIX + \"while iteration\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n\n    if (state.isWhileStackEmpty()) {\n      throw context\n          .makeException(\"Detected \" + getFullName() + \" without \" + DIRECTIVE_PREFIX + \"while\",\n              null);\n    }\n\n    final TextFileDataContainer whileContainer = Objects.requireNonNull(state.peekWhile());\n    state.popAllIFUntilContainerWithFile(whileContainer);\n    state.popWhile();\n    state.goToString(whileContainer.getNextStringIndex());\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/DefineDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.ExpressionItem;\nimport com.igormaznitsa.jcp.expression.ExpressionItemType;\nimport com.igormaznitsa.jcp.expression.ExpressionParser;\nimport com.igormaznitsa.jcp.expression.ExpressionTree;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.Variable;\nimport java.io.IOException;\nimport java.util.Objects;\n\n/**\n * The class implements the //#define directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class DefineDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"define\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.TAIL;\n  }\n\n  @Override\n  public String getReference() {\n    return \"add global BOOL variable (default TRUE or set from expression)\";\n  }\n\n  protected void process(final PreprocessorContext context, final String varName, final Value value,\n                         final boolean exists) {\n    if (exists) {\n      context.logWarning(\"Variable '\" + varName + \"' already defined\");\n    }\n    context.setGlobalVariable(varName, value);\n  }\n\n  @Override\n\n  public AfterDirectiveProcessingBehaviour execute(final String rawTail,\n                                                   final PreprocessorContext context) {\n    try {\n      final String trimmedTail = rawTail.trim();\n      final int spaceIndex = trimmedTail.indexOf(' ');\n      final String name;\n      final String expression;\n      if (spaceIndex > 0) {\n        name = trimmedTail.substring(0, spaceIndex).trim();\n        final String trimmed = trimmedTail.substring(spaceIndex).trim();\n        expression =\n            trimmed.isEmpty() || trimmed.startsWith(\"//\") || trimmed.startsWith(\"/*\") ? null :\n                trimmed;\n      } else {\n        name = trimmedTail;\n        expression = null;\n      }\n\n      final ExpressionTree nameTree = ExpressionParser.getInstance().parse(name, context);\n\n      if (nameTree.isEmpty()) {\n        throw context.makeException(\"Var name is empty\", null);\n      }\n\n      final ExpressionItem item = Objects.requireNonNull(nameTree.getRoot().getItem());\n      if (item.getExpressionItemType() != ExpressionItemType.VARIABLE) {\n        throw context.makeException(\"Can't recognize variable name [\" + name + ']', null);\n      }\n\n      final Value value;\n\n      if (expression != null) {\n        value = Expression.evalExpression(expression, context);\n      } else {\n        value = Value.valueOf(Boolean.TRUE);\n      }\n\n      process(context, ((Variable) item).getName(), value,\n          context.findVariableForName(name, true) != null);\n    } catch (IOException ex) {\n      throw context.makeException(\"Unexpected exception\", ex);\n    }\n\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/DefinelDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the //#definel directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class DefinelDirectiveHandler extends DefineDirectiveHandler {\n\n  @Override\n\n  public String getName() {\n    return \"definel\";\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"add local BOOL variable (default TRUE or from expression)\";\n  }\n\n  @Override\n  protected void process(final PreprocessorContext context, final String varName, final Value value,\n                         final boolean exists) {\n    context.setLocalVariable(varName, value);\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/DirectiveArgumentType.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\n/**\n * The enumeration contains possible argument types are being used by directives\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic enum DirectiveArgumentType {\n\n  NONE(\"\"),\n  STRING(\"STRING\"),\n  TAIL(\"TAIL\"),\n  BOOLEAN(\"BOOLEAN\"),\n  VARNAME(\"VAR\"),\n  EXPRESSION(\"EXPR\"),\n  MULTI_EXPRESSION(\"EXPR1,EXPR2...EXPRn\"),\n  SET(\"VAR=EXPR\"),\n  ON_OFF(\"[+|-]\");\n\n  private final String str;\n\n  DirectiveArgumentType(final String str) {\n    this.str = str;\n  }\n\n  public String getAsText() {\n    return this.str;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/EchoDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\n\n/**\n * The class implements //#assert directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class EchoDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"echo\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.TAIL;\n  }\n\n  @Override\n  public String getReference() {\n    return \"log info message (macros allowed)\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    context.logInfo(PreprocessorUtils.processMacroses(string.trim(), context));\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/ElseDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#else directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ElseDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"else\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"invert \" + DIRECTIVE_PREFIX + \"if condition result\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (state.isIfStackEmpty()) {\n      throw context\n          .makeException(\"Detected \" + getFullName() + \" without \" + DIRECTIVE_PREFIX + \"if\", null);\n    }\n\n    if (state.isAtActiveIf()) {\n      if (state.getPreprocessingFlags().contains(PreprocessingFlag.IF_CONDITION_FALSE)) {\n        state.getPreprocessingFlags().remove(PreprocessingFlag.IF_CONDITION_FALSE);\n      } else {\n        state.getPreprocessingFlags().add(PreprocessingFlag.IF_CONDITION_FALSE);\n      }\n    }\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n\n  @Override\n  public boolean executeOnlyWhenExecutionAllowed() {\n    return false;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/EndDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.containers.TextFileDataContainer;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.Objects;\n\n/**\n * The class implements the //#end directive\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class EndDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"end\";\n  }\n\n  @Override\n  public String getReference() {\n    return DIRECTIVE_PREFIX + \"while loop end, continue next iteration\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (state.isWhileStackEmpty()) {\n      throw context\n          .makeException(\"Detected \" + getFullName() + \" without \" + DIRECTIVE_PREFIX + \"while\",\n              null);\n    }\n\n    if (state.isDirectiveCanBeProcessedIgnoreBreak()) {\n      final TextFileDataContainer thisWhile =\n          Objects.requireNonNull(state.peekWhile(), \"'WHILE' stack is empty!\");\n      final boolean breakIsSet =\n          state.getPreprocessingFlags().contains(PreprocessingFlag.BREAK_COMMAND);\n      state.popWhile();\n      if (!breakIsSet) {\n        state.goToString(thisWhile.getNextStringIndex());\n      }\n    } else {\n      state.popWhile();\n    }\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n\n  @Override\n  public boolean executeOnlyWhenExecutionAllowed() {\n    return false;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/EndIfDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#endif directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class EndIfDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n\n  public String getName() {\n    return \"endif\";\n  }\n\n  @Override\n  public boolean executeOnlyWhenExecutionAllowed() {\n    return false;\n  }\n\n  @Override\n  public String getReference() {\n    return \"end of \" + DIRECTIVE_PREFIX + \"if...\" + getFullName() + \" block\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (state.isIfStackEmpty()) {\n      throw context\n          .makeException(\"Detected \" + getFullName() + \" without \" + DIRECTIVE_PREFIX + \"if\", null);\n    }\n\n    if (!state.isDirectiveCanBeProcessed() && state.isAtActiveIf()) {\n      state.getPreprocessingFlags().remove(PreprocessingFlag.IF_CONDITION_FALSE);\n    }\n\n    state.popIf();\n\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/ErrorDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\n\n/**\n * The class implements //#error directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ErrorDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"error\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.EXPRESSION;\n  }\n\n  @Override\n  public String getReference() {\n    return \"throw fatal preprocessor error with message and abort\";\n  }\n\n  protected void process(final PreprocessorContext context, final String message) {\n    final String text = PreprocessorUtils.processMacroses(message, context);\n    context.logError(text);\n    throw context.makeException(text, null);\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String trimmedString,\n                                                   final PreprocessorContext context) {\n    final String message = trimmedString.isEmpty() ? \"Thrown fatal error\" :\n        Expression.evalExpression(trimmedString, context).toString();\n    process(context, message);\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/ExcludeIfDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static java.util.Objects.requireNonNull;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#excludeif directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ExcludeIfDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"excludeif\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"ignore file if argument is TRUE\";\n  }\n\n  @Override\n  public boolean isGlobalPhaseAllowed() {\n    return true;\n  }\n\n  @Override\n  public boolean isPreprocessingPhaseAllowed() {\n    return false;\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.BOOLEAN;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    state.pushExcludeIfData(state.getRootFileInfo(), string,\n        requireNonNull(state.peekIncludeStackFile(), \"'IF' stack is empty!\")\n            .getLastReadStringIndex());\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/ExitDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#exit directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ExitDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"exit\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"immediately end file preprocessing, return to caller\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    state.getPreprocessingFlags().add(PreprocessingFlag.END_PROCESSING);\n    if (context.isVerbose()) {\n      context.logForVerbose(\"Detected \" + getFullName());\n    }\n    return AfterDirectiveProcessingBehaviour.READ_NEXT_LINE;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/ExitIfDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\n\n/**\n * The class implements the //#exitif directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ExitIfDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"exitif\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"conditionally end file preprocessing, return to caller\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.BOOLEAN;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    AfterDirectiveProcessingBehaviour result = AfterDirectiveProcessingBehaviour.PROCESSED;\n\n    // To end processing the file processing immediately if the value is true\n    final Value condition = Expression.evalExpression(string, context);\n    if (condition.getType() != ValueType.BOOLEAN) {\n      throw context.makeException(getFullName() + \" needs boolean argument\", null);\n    }\n    if (((Boolean) condition.getValue())) {\n      state.getPreprocessingFlags().add(PreprocessingFlag.END_PROCESSING);\n      result = AfterDirectiveProcessingBehaviour.READ_NEXT_LINE;\n      if (context.isVerbose()) {\n        context.logForVerbose(\"Detected \" + getFullName() + \" with active flag\");\n      }\n    }\n    return result;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/FlushDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.findActiveFileInfoContainer;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.io.File;\nimport java.io.IOException;\n\n/**\n * The class implements the //#flush directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class FlushDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"flush\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"flush current text buffers to file and clear them\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (!context.isDryRun()) {\n      final File outFile = context\n          .createDestinationFileForPath(state.getRootFileInfo().makeTargetFilePathAsString());\n      try {\n        if (context.isVerbose()) {\n          context.logForVerbose(\"Flushing buffers into file '\" + outFile + '\\'');\n        }\n        final boolean saved = state.saveBuffersToFile(outFile, context.getKeepComments());\n        if (context.isVerbose()) {\n          context.logForVerbose(\n              \"Content was \" + (saved ? \"saved\" : \"not saved\") + \" into file '\" + outFile + \"'\");\n        }\n\n        findActiveFileInfoContainer(context)\n            .ifPresent(f -> f.getGeneratedResources().add(outFile));\n\n        state.resetPrinters();\n      } catch (IOException ex) {\n        throw context.makeException(\"Can't flush text buffers\", ex);\n      }\n    }\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/GlobalDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\n\n/**\n * The class implements the //#global directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class GlobalDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"global\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.SET;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    processDefinition(string, context);\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n\n  @Override\n  public String getReference() {\n    return \"set or define a global (including special) variable\";\n  }\n\n  @Override\n  public boolean isGlobalPhaseAllowed() {\n    return true;\n  }\n\n  @Override\n  public boolean isPreprocessingPhaseAllowed() {\n    return false;\n  }\n\n  private void processDefinition(final String string, final PreprocessorContext context) {\n    final String[] split = PreprocessorUtils.splitForEqualChar(string);\n\n    if (split.length != 2) {\n      throw context.makeException(\"Can't find expression [\" + string + ']', null);\n    }\n\n    final String name = split[0].trim();\n    final Value newValue = Expression.evalExpression(split[1].trim(), context);\n\n    context.setGlobalVariable(name, newValue);\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/GlobalElseDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#_else directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class GlobalElseDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"_else\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"invert \" + DIRECTIVE_PREFIX + \"_if condition result\";\n  }\n\n  @Override\n  public boolean isGlobalPhaseAllowed() {\n    return true;\n  }\n\n  @Override\n  public boolean isPreprocessingPhaseAllowed() {\n    return false;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (state.isIfStackEmpty()) {\n      throw context\n          .makeException(\"Detected \" + getFullName() + \" without \" + DIRECTIVE_PREFIX + \"_if\",\n              null);\n    }\n\n    if (state.isAtActiveIf()) {\n      if (state.getPreprocessingFlags().contains(PreprocessingFlag.IF_CONDITION_FALSE)) {\n        state.getPreprocessingFlags().remove(PreprocessingFlag.IF_CONDITION_FALSE);\n      } else {\n        state.getPreprocessingFlags().add(PreprocessingFlag.IF_CONDITION_FALSE);\n      }\n    }\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n\n  @Override\n  public boolean executeOnlyWhenExecutionAllowed() {\n    return false;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/GlobalEndIfDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#_endif directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class GlobalEndIfDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n\n  public String getName() {\n    return \"_endif\";\n  }\n\n  @Override\n  public boolean executeOnlyWhenExecutionAllowed() {\n    return false;\n  }\n\n  @Override\n  public String getReference() {\n    return \"end \" + DIRECTIVE_PREFIX + \"_if block\";\n  }\n\n  @Override\n  public boolean isGlobalPhaseAllowed() {\n    return true;\n  }\n\n  @Override\n  public boolean isPreprocessingPhaseAllowed() {\n    return false;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (state.isIfStackEmpty()) {\n      throw context\n          .makeException(\"Detected \" + getFullName() + \" without \" + DIRECTIVE_PREFIX + \"_if\",\n              null);\n    }\n\n    if (!state.isDirectiveCanBeProcessed() && state.isAtActiveIf()) {\n      state.getPreprocessingFlags().remove(PreprocessingFlag.IF_CONDITION_FALSE);\n    }\n\n    state.popIf();\n\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/GlobalIfDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\n\n/**\n * The class implements the //#_if directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class GlobalIfDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"_if\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"start \" + DIRECTIVE_PREFIX + getFullName() + \" block\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.BOOLEAN;\n  }\n\n  @Override\n  public boolean executeOnlyWhenExecutionAllowed() {\n    return false;\n  }\n\n  @Override\n  public boolean isGlobalPhaseAllowed() {\n    return true;\n  }\n\n  @Override\n  public boolean isPreprocessingPhaseAllowed() {\n    return false;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (state.isDirectiveCanBeProcessed()) {\n      final Value expressionResult = Expression.evalExpression(string, context);\n      if (expressionResult.getType() != ValueType.BOOLEAN) {\n        throw context.makeException(\"Non boolean argument\", null);\n      }\n      state.pushIf(true);\n      if (!expressionResult.asBoolean()) {\n        state.getPreprocessingFlags().add(PreprocessingFlag.IF_CONDITION_FALSE);\n      }\n    } else {\n      state.pushIf(false);\n    }\n\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/IfDefDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\n/**\n * The class implements short synonym for the //#ifdefined directive\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class IfDefDirectiveHandler extends IfDefinedDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"ifdef\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"short form of \" + DIRECTIVE_PREFIX + super.getName();\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/IfDefinedDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#ifdefined directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class IfDefinedDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"ifdefined\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"check if variable exists in current context and start \" + DIRECTIVE_PREFIX +\n        \"ifdefined..\" + DIRECTIVE_PREFIX + \"else..\" + DIRECTIVE_PREFIX + \"endif block\";\n  }\n\n  protected boolean postprocessFlag(final boolean variableExists) {\n    return !variableExists;\n  }\n\n  @Override\n  public boolean executeOnlyWhenExecutionAllowed() {\n    return false;\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.VARNAME;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (state.isDirectiveCanBeProcessed()) {\n      if (string.isEmpty()) {\n        throw context.makeException(getFullName() + \" needs variable name\", null);\n      }\n      state.pushIf(true);\n      final boolean variableExists = context.findVariableForName(string, true) != null;\n      if (postprocessFlag(variableExists)) {\n        state.getPreprocessingFlags().add(PreprocessingFlag.IF_CONDITION_FALSE);\n      }\n    } else {\n      state.pushIf(false);\n    }\n\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/IfDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\n\n/**\n * The class implements the //#if directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class IfDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"if\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"start \" + DIRECTIVE_PREFIX + \"if..\" + DIRECTIVE_PREFIX + \"else..\" +\n        DIRECTIVE_PREFIX + \"endif block\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.BOOLEAN;\n  }\n\n  @Override\n  public boolean executeOnlyWhenExecutionAllowed() {\n    return false;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (state.isDirectiveCanBeProcessed()) {\n      final Value expressionResult = Expression.evalExpression(string, context);\n      if (expressionResult.getType() != ValueType.BOOLEAN) {\n        throw context.makeException(\"Non boolean flag\", null);\n      }\n      state.pushIf(true);\n      if (!expressionResult.asBoolean()) {\n        state.getPreprocessingFlags().add(PreprocessingFlag.IF_CONDITION_FALSE);\n      }\n    } else {\n      state.pushIf(false);\n    }\n\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/IfNDefDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\n/**\n * The class implements the //#ifndef directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class IfNDefDirectiveHandler extends IfDefinedDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"ifndef\";\n  }\n\n  @Override\n  protected boolean postprocessFlag(final boolean variableExists) {\n    return variableExists;\n  }\n\n  @Override\n  public String getReference() {\n    return \"same as \" + DIRECTIVE_PREFIX + super.getName() +\n        \" but triggers if variable is undefined\";\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/IncludeDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.findActiveFileInfoContainer;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport java.io.File;\nimport java.io.IOException;\n\n/**\n * The class implements the //#include directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class IncludeDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"include\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"include file content in current preprocessing context\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.STRING;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    final Value includingFilePath = Expression.evalExpression(string, context);\n\n    final String filePath = includingFilePath.toString();\n\n    try {\n      final File fileToInclude = context.findFileInSources(filePath);\n      if (context.isVerbose()) {\n        context.logForVerbose(\"Including file '\" + fileToInclude.getCanonicalPath() + '\\'');\n      }\n      state.openFile(fileToInclude);\n\n      findActiveFileInfoContainer(context)\n          .ifPresent(f -> f.getIncludedSources().add(fileToInclude));\n    } catch (IOException ex) {\n      throw context.makeException(\"Can't open file '\" + filePath + '\\'', ex);\n    }\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/LocalDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\n\n/**\n * The class implements the //#local directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class LocalDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"local\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    processLocalDefinition(string, context);\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n\n  @Override\n  public String getReference() {\n    return \"define local variable (file-scoped, no special vars)\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.SET;\n  }\n\n  private void processLocalDefinition(final String string, final PreprocessorContext context) {\n    final String[] split = PreprocessorUtils.splitForEqualChar(string);\n\n    if (split.length != 2) {\n      throw context.makeException(\"Can't find expression\", null);\n    }\n\n    final String name = split[0];\n    final Value value = Expression.evalExpression(split[1], context);\n\n    context.setLocalVariable(name, value);\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/MsgDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\n\n/**\n * The class implements //#msg directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class MsgDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"msg\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.TAIL;\n  }\n\n  @Override\n  public String getReference() {\n    return \"log info message with macros, add include stack if verbose\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String rawTail,\n                                                   final PreprocessorContext context) {\n    final String normal =\n        (!rawTail.isEmpty() && Character.isSpaceChar(rawTail.charAt(0))) ? rawTail.substring(1) :\n            rawTail;\n    final String message = PreprocessorUtils.processMacroses(normal, context);\n    if (context.isVerbose()) {\n      context.logForVerbose(message);\n    } else {\n      context.logInfo(message);\n    }\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/NoAutoFlushHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.Objects;\n\n/**\n * The class implements the //#noautoflush directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class NoAutoFlushHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"noautoflush\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"disable auto-flush of buffers at EOF\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (context.isVerbose()) {\n      context.logForVerbose(\"Disabling auto-flush\");\n    }\n    Objects.requireNonNull(state.peekIncludeStackFile(), \"File stack is empty!\").disableAutoFlush();\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/OutDisabledDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#- directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class OutDisabledDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"-\";\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"disable text output to buffers\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    context.getPreprocessingState().getPreprocessingFlags()\n        .add(PreprocessingFlag.TEXT_OUTPUT_DISABLED);\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/OutEnabledDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#+ directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class OutEnabledDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"+\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"enable text output to buffers\";\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    context.getPreprocessingState().getPreprocessingFlags()\n        .remove(PreprocessingFlag.TEXT_OUTPUT_DISABLED);\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/OutNameDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.JCPSpecialVariableProcessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the //#outname directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class OutNameDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"outname\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"change target file name (same as set the special var '\" +\n        JCPSpecialVariableProcessor.VAR_DEST_FILE_NAME + \"')\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.STRING;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final Value fileName = Expression.evalExpression(string, context);\n    final String fileNameAsStr = fileName.toString();\n    if (context.isVerbose()) {\n      context.logForVerbose(\"Change target file name to '\" + fileNameAsStr + \"'\");\n    }\n    context.getPreprocessingState().getRootFileInfo().setTargetFileName(fileNameAsStr);\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/OutdirDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.JCPSpecialVariableProcessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the //#outdir directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class OutdirDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"outdir\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"change target file folder (same as set the special var '\" +\n        JCPSpecialVariableProcessor.VAR_DEST_DIR + \"')\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.STRING;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final Value name = Expression.evalExpression(string, context);\n    final String nameAsString = name.toString();\n    if (context.isVerbose()) {\n      context.logForVerbose(\"Change result file folder '\" + nameAsString + \"'\");\n    }\n    context.getPreprocessingState().getRootFileInfo().setTargetFolder(nameAsString);\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/PostfixDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#postfix[+|-] directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class PostfixDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"postfix\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"enable (+) or disable (-) output to postfix buffer\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.ON_OFF;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (!string.isEmpty()) {\n      switch (string.charAt(0)) {\n        case '+': {\n          state.selectPrinter(PreprocessingState.PrinterType.POSTFIX);\n        }\n        break;\n        case '-': {\n          state.selectPrinter(PreprocessingState.PrinterType.NORMAL);\n        }\n        break;\n        default: {\n          throw context.makeException(\"Unsupported ending [\" + string + ']', null);\n        }\n      }\n      return AfterDirectiveProcessingBehaviour.PROCESSED;\n    }\n    throw context.makeException(getFullName() + \" needs ending [+|-]\", null);\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/PrefixDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\n/**\n * The class implements the //#prefix[+|-] directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class PrefixDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"prefix\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"enable (+) or disable (-) output to prefix buffer\";\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.ON_OFF;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n    if (!string.isEmpty()) {\n      switch (string.charAt(0)) {\n        case '+': {\n          state.selectPrinter(PreprocessingState.PrinterType.PREFIX);\n        }\n        break;\n        case '-': {\n          state.selectPrinter(PreprocessingState.PrinterType.NORMAL);\n        }\n        break;\n        default: {\n          throw context.makeException(\"Unsupported ending [\" + string + ']', null);\n        }\n      }\n      return AfterDirectiveProcessingBehaviour.PROCESSED;\n    }\n    throw context.makeException(getFullName() + \" needs ending [+|-]\", null);\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/UndefDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the //#undef directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class UndefDirectiveHandler extends DefineDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"undef\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"undefine variable from context\";\n  }\n\n  @Override\n  protected void process(final PreprocessorContext context, final String varName, final Value value,\n                         final boolean exists) {\n    if (context.isLocalVariable(varName)) {\n      context.removeLocalVariable(varName);\n    } else if (context.isGlobalVariable(varName)) {\n      context.removeGlobalVariable(varName);\n    } else {\n      throw context.makeException(\"Attempting to undefine unknown variable '\" + value + \"'\", null);\n    }\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/WarningDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\n\n/**\n * The class implements //#warning directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class WarningDirectiveHandler extends ErrorDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"warning\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"log warning message (macros allowed)\";\n  }\n\n  @Override\n  protected void process(final PreprocessorContext context, final String message) {\n    context.logWarning(PreprocessorUtils.processMacroses(message, context));\n    if (context.isVerbose()) {\n      context.logForVerbose(\"Detected warning : \" + message);\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/directives/WhileDirectiveHandler.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.containers.PreprocessingFlag;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\n\n/**\n * The class implements the //#while directive handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class WhileDirectiveHandler extends AbstractDirectiveHandler {\n\n  @Override\n  public String getName() {\n    return \"while\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"start \" + getFullName() + \"..\" + DIRECTIVE_PREFIX + \"end loop\";\n  }\n\n  @Override\n  public boolean executeOnlyWhenExecutionAllowed() {\n    return false;\n  }\n\n  @Override\n  public DirectiveArgumentType getArgumentType() {\n    return DirectiveArgumentType.BOOLEAN;\n  }\n\n  @Override\n  public AfterDirectiveProcessingBehaviour execute(final String string,\n                                                   final PreprocessorContext context) {\n    final PreprocessingState state = context.getPreprocessingState();\n\n    if (state.isDirectiveCanBeProcessed()) {\n      final Value condition = Expression.evalExpression(string, context);\n      if (condition.getType() != ValueType.BOOLEAN) {\n        throw context.makeException(\"Non boolean argument\", null);\n      }\n\n      state.pushWhile(true);\n      if (!condition.asBoolean()) {\n        state.getPreprocessingFlags().add(PreprocessingFlag.BREAK_COMMAND);\n      }\n    } else {\n      state.pushWhile(false);\n    }\n\n    return AfterDirectiveProcessingBehaviour.PROCESSED;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/exceptions/FilePositionInfo.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.exceptions;\n\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.File;\nimport java.util.Objects;\n\n/**\n * The class implements a file data storage where an exception can store a\n * snapshot of the current preprocessing file data\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class FilePositionInfo {\n\n  /**\n   * The preprocessing file\n   */\n  private final File file;\n\n  /**\n   * The current string index in the file\n   */\n  private final int stringIndex;\n\n  public FilePositionInfo(final File file, final int stringIndex) {\n    Objects.requireNonNull(file, \"File is null\");\n    this.file = file;\n    this.stringIndex = stringIndex;\n  }\n\n\n  public File getFile() {\n    return this.file;\n  }\n\n  /**\n   * Get zero based line index\n   *\n   * @return zero based line index or -1 if there is no info\n   */\n  public int getStringIndex() {\n    return this.stringIndex < 0 ? -1 : this.stringIndex;\n  }\n\n  /**\n   * Get line number, starting position is one\n   *\n   * @return line number started from one, -1 if there is no info\n   */\n  public int getLineNumber() {\n    return this.stringIndex < 0 ? -1 : this.stringIndex + 1;\n  }\n\n  public String toShortString() {\n    return this.file.getName() + ':' + this.getLineNumber();\n  }\n\n  @Override\n  public String toString() {\n    final String filePath = PreprocessorUtils.getFilePath(this.file);\n    return filePath + ':' + this.getLineNumber();\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/exceptions/PreprocessorException.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.exceptions;\n\nimport java.io.File;\nimport java.io.PrintWriter;\nimport java.io.StringWriter;\n\n/**\n * The exception allows to save some useful data about preprocessing files like the current include stack and the error string index\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class PreprocessorException extends RuntimeException {\n\n  private static final long serialVersionUID = 2857499664112391862L;\n\n  private final String processingString;\n  private final transient FilePositionInfo[] includeStack;\n\n  public PreprocessorException(final String message, final String processedText,\n                               final FilePositionInfo[] includeStack, final Throwable cause) {\n    super(message, cause);\n\n    this.processingString = processedText;\n    this.includeStack = includeStack == null ? new FilePositionInfo[0] : includeStack.clone();\n  }\n\n\n  private static String makeStackView(final FilePositionInfo[] list, final char fill) {\n    if (list == null || list.length == 0) {\n      return \"\";\n    }\n    final StringBuilder builder = new StringBuilder();\n    int tab = 5;\n\n    builder.append(String.valueOf(fill).repeat(tab));\n    builder.append(\"{File chain}\");\n    tab += 5;\n\n    int fileIndex = 1;\n    for (int i = list.length - 1; i >= 0; i--) {\n      final FilePositionInfo cur = list[i];\n      builder.append('\\n');\n      builder.append(String.valueOf(fill).repeat(Math.max(0, tab)));\n      builder.append(\"└>\");\n      builder.append(fileIndex++).append(\". \");\n      builder.append(cur.getFile().getName()).append(':').append(cur.getLineNumber());\n      tab += 3;\n    }\n\n    return builder.toString();\n  }\n\n\n  public static PreprocessorException extractPreprocessorException(final Throwable thr) {\n    if (thr == null) {\n      return null;\n    }\n    Throwable result = thr;\n    do {\n      if (result instanceof PreprocessorException) {\n        return (PreprocessorException) result;\n      }\n      result = result.getCause();\n    } while (result != null);\n    return null;\n  }\n\n\n  public static String referenceAsString(final char fillChar, final Throwable thr) {\n    if (thr == null) {\n      return \"\";\n    }\n    final StringWriter buffer = new StringWriter(1024);\n    final PrintWriter out = new PrintWriter(buffer);\n    final PreprocessorException pp = PreprocessorException.extractPreprocessorException(thr);\n    if (pp == null) {\n      out.println(thr.getMessage());\n      thr.printStackTrace(out);\n    } else {\n      out.println(pp.getMessage());\n      out.println(makeStackView(pp.getIncludeChain(), fillChar));\n      if (pp.getCause() != null) {\n        pp.getCause().printStackTrace(out);\n      }\n    }\n    return buffer.toString();\n  }\n\n\n  public File getRootFile() {\n    if (includeStack.length == 0) {\n      return null;\n    } else {\n      return includeStack[includeStack.length - 1].getFile();\n    }\n  }\n\n\n  public File getProcessingFile() {\n    if (includeStack.length == 0) {\n      return null;\n    } else {\n      return includeStack[0].getFile();\n    }\n  }\n\n  public int getLineNumber() {\n    if (includeStack.length == 0) {\n      return -1;\n    } else {\n      return includeStack[0].getLineNumber();\n    }\n  }\n\n\n  public String getProcessingString() {\n    return this.processingString;\n  }\n\n\n  private String convertIncludeStackToString() {\n    final StringBuilder result = new StringBuilder();\n    for (int i = 0; i < this.includeStack.length; i++) {\n      if (i > 0) {\n        result.append(\"<-\");\n      }\n      result.append(this.includeStack[i].toString());\n    }\n    return result.toString();\n  }\n\n  public FilePositionInfo[] getIncludeChain() {\n    return this.includeStack.clone();\n  }\n\n  @Override\n  public String toString() {\n    return getMessage() + \", include stack: \" + convertIncludeStackToString() + \", source line: \" +\n        this.processingString;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/Expression.java",
    "content": "/*\r\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\r\n *\r\n * Licensed to the Apache Software Foundation (ASF) under one\r\n * or more contributor license agreements.  See the NOTICE file\r\n * distributed with this work for additional information\r\n * regarding copyright ownership.  The ASF licenses this file\r\n * to you under the Apache License, Version 2.0 (the\r\n * \"License\"); you may not use this file except in compliance\r\n * with the License.  You may obtain a copy of the License at\r\n *\r\n *   http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing,\r\n * software distributed under the License is distributed on an\r\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n * KIND, either express or implied.  See the License for the\r\n * specific language governing permissions and limitations\r\n * under the License.\r\n */\r\n\r\npackage com.igormaznitsa.jcp.expression;\r\n\r\nimport static com.igormaznitsa.jcp.expression.ExpressionTreeElement.ANY_ARITY;\r\n\r\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\r\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\r\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\r\nimport com.igormaznitsa.jcp.expression.functions.AbstractFunction;\r\nimport com.igormaznitsa.jcp.expression.functions.FunctionDefinedByUser;\r\nimport com.igormaznitsa.jcp.expression.operators.AbstractOperator;\r\nimport java.io.IOException;\r\nimport java.lang.reflect.InvocationTargetException;\r\nimport java.lang.reflect.Method;\r\nimport java.util.ArrayList;\r\nimport java.util.Arrays;\r\nimport java.util.List;\r\nimport java.util.Objects;\r\n\r\n/**\r\n * The main class to calculate expressions\r\n *\r\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\r\n */\r\npublic class Expression {\r\n\r\n  /**\r\n   * Pre-created array for speed up operations\r\n   */\r\n  private static final Class<?>[] OPERATOR_SIGNATURE_1 = new Class<?>[] {Value.class};\r\n\r\n  /**\r\n   * Pre-created array for speed up operations\r\n   */\r\n  private static final Class<?>[] OPERATOR_SIGNATURE_2 = new Class<?>[] {Value.class, Value.class};\r\n\r\n  /**\r\n   * The variable contains the expression tree\r\n   */\r\n  private final ExpressionTree expressionTree;\r\n\r\n  private Expression(final ExpressionTree tree) {\r\n    this.expressionTree = tree;\r\n  }\r\n\r\n  /**\r\n   * Evaluate expression\r\n   *\r\n   * @param expression the expression as a String, must not be null\r\n   * @param context    a preprocessor context to be used for expression operations\r\n   * @return the result as a Value object, it can't be null\r\n   */\r\n  public static Value evalExpression(final String expression, final PreprocessorContext context) {\r\n    try {\r\n      final ExpressionTree tree = ExpressionParser.getInstance().parse(expression, context);\r\n      return evalTree(tree, context);\r\n    } catch (IOException unexpected) {\r\n      throw context\r\n          .makeException(\"[Expression]Wrong expression format detected [\" + expression + ']',\r\n              unexpected);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Evaluate an expression tree\r\n   *\r\n   * @param tree    an expression tree, it must not be null\r\n   * @param context a preprocessor context to be used for expression operations\r\n   * @return the result as a Value object, it can't be null\r\n   */\r\n  public static Value evalTree(final ExpressionTree tree, final PreprocessorContext context) {\r\n    final Expression exp = new Expression(tree);\r\n    return exp.eval(context);\r\n  }\r\n\r\n  private ExpressionTreeElement evalFunction(\r\n      final ExpressionTreeElement treeElement,\r\n      final PreprocessorContext context) {\r\n\r\n    final AbstractFunction functionElement = (AbstractFunction) treeElement.getItem();\r\n    final List<ExpressionTreeElement> children = treeElement.extractEffectiveChildren();\r\n\r\n    if (!functionElement.getArity().contains(-1) &&\r\n        !functionElement.getArity().contains(children.size())) {\r\n      throw context\r\n          .makeException(\r\n              \"Can't find '\" + functionElement.getName() + \"' for arity \" + children.size(), null);\r\n    }\r\n\r\n    final int arity = children.size();\r\n    final List<Value> arguments = new ArrayList<>();\r\n    final Class<?>[] methodArguments = new Class<?>[arity + 1];\r\n    methodArguments[0] = PreprocessorContext.class;\r\n\r\n    final FilePositionInfo[] stack;\r\n    final String sources;\r\n\r\n    stack = context.getPreprocessingState().makeIncludeStack();\r\n    sources = context.getPreprocessingState().getLastReadString();\r\n\r\n    final StringBuilder signature = new StringBuilder(AbstractFunction.EXECUTION_PREFIX);\r\n\r\n    for (int i = 1; i <= arity; i++) {\r\n      methodArguments[i] = Value.class;\r\n    }\r\n\r\n    for (int i = 0; i < arity; i++) {\r\n      final ExpressionTreeElement item =\r\n          this.calculateTreeElement(children.get(i), context);\r\n\r\n      final ExpressionItem itemValue = item.getItem();\r\n\r\n      if (itemValue instanceof Value) {\r\n        arguments.add((Value) itemValue);\r\n      } else {\r\n        throw context.makeException(\r\n            \"[Expression]Wrong argument type detected for the '\" + functionElement.getName() +\r\n                \"' function\", null);\r\n      }\r\n    }\r\n\r\n    final List<List<ValueType>> allowedSignatures = functionElement.getAllowedArgumentTypes();\r\n    List<ValueType> allowed = null;\r\n    for (final List<ValueType> current : allowedSignatures) {\r\n      if (current.size() != arguments.size()) {\r\n        continue;\r\n      }\r\n      boolean allCompatible = true;\r\n\r\n      int thatIndex = 0;\r\n      for (final ValueType type : current) {\r\n        if (!type.isCompatible(arguments.get(thatIndex).getType())) {\r\n          allCompatible = false;\r\n          break;\r\n        }\r\n        thatIndex++;\r\n      }\r\n\r\n      if (allCompatible) {\r\n        allowed = current;\r\n        for (final ValueType type : allowed) {\r\n          signature.append(type.getSignature());\r\n        }\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (allowed == null) {\r\n      if (functionElement.getArity().contains(ANY_ARITY)) {\r\n        signature.append(ValueType.ANY.getSignature());\r\n      } else {\r\n        throw context.makeException(\r\n            \"[Expression]Unsupported argument detected for '\" + functionElement.getName() + '\\'',\r\n            null);\r\n      }\r\n    }\r\n\r\n    if (functionElement instanceof FunctionDefinedByUser) {\r\n      final FunctionDefinedByUser userFunction = (FunctionDefinedByUser) functionElement;\r\n      try {\r\n        return new ExpressionTreeElement(userFunction.execute(context, arguments), stack, sources);\r\n      } catch (Exception unexpected) {\r\n        throw context\r\n            .makeException(\"[Expression]Unexpected exception during a user function processing\",\r\n                unexpected);\r\n      }\r\n    } else {\r\n      try {\r\n        final Method method =\r\n            functionElement.getClass().getMethod(signature.toString(), methodArguments);\r\n\r\n        final Object[] callArgs = new Object[arity + 1];\r\n        callArgs[0] = context;\r\n        System.arraycopy(arguments.toArray(), 0, callArgs, 1, arity);\r\n\r\n        final Value result = (Value) method.invoke(functionElement, callArgs);\r\n\r\n        if (!result.getType().isCompatible(functionElement.getResultType())) {\r\n          throw context.makeException(\"[Expression]Unsupported function result detected [\" +\r\n              result.getType().getSignature() + ']', null);\r\n        }\r\n\r\n        return new ExpressionTreeElement(result, stack, sources);\r\n      } catch (NoSuchMethodException unexpected) {\r\n        throw context.makeException(\r\n            \"[Expression]Can't find a function method to process data [\" + signature +\r\n                ']', unexpected);\r\n      } catch (Exception unexpected) {\r\n        final Throwable cause = unexpected.getCause();\r\n        if (cause instanceof PreprocessorException) {\r\n          throw (PreprocessorException) cause;\r\n        }\r\n        throw context.makeException(\r\n            \"[Expression]Can't execute a function method to process data [\" +\r\n                functionElement.getClass().getName() + '.' + signature + ']', unexpected);\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n  private ExpressionTreeElement evalOperator(final ExpressionTreeElement operatorElement,\r\n                                             final PreprocessorContext context) {\r\n    final AbstractOperator operator = (AbstractOperator) operatorElement.getItem();\r\n\r\n    final int arity = operator.getArity();\r\n\r\n    final Value[] arguments = new Value[arity];\r\n    final Class<?>[] methodArguments = arity == 1 ? OPERATOR_SIGNATURE_1 : OPERATOR_SIGNATURE_2;\r\n\r\n    final StringBuilder signatureNormal = new StringBuilder(AbstractOperator.EXECUTION_PREFIX);\r\n    final StringBuilder signatureAnyLeft = new StringBuilder(AbstractOperator.EXECUTION_PREFIX);\r\n    final StringBuilder signatureAnyRight = new StringBuilder(AbstractOperator.EXECUTION_PREFIX);\r\n\r\n    final FilePositionInfo[] stack;\r\n    final String sources;\r\n\r\n    stack = context.getPreprocessingState().makeIncludeStack();\r\n    sources = context.getPreprocessingState().getLastReadString();\r\n\r\n    for (int i = 0; i < arity; i++) {\r\n      final ExpressionTreeElement arg = operatorElement.getChildForIndex(i);\r\n      if (arg == ExpressionTreeElement.EMPTY_SLOT) {\r\n        throw context.makeException(\r\n            \"[Expression]There is not needed argument for the operator [\" + operator.getKeyword() +\r\n                ']', null);\r\n      }\r\n\r\n      final ExpressionTreeElement currentElement = calculateTreeElement(arg, context);\r\n\r\n      final ExpressionItem item = currentElement.getItem();\r\n\r\n      if (item instanceof Value) {\r\n        arguments[i] = (Value) item;\r\n      } else {\r\n        throw context.makeException(\r\n            \"[Expression]Non-value detected for the '\" + operator.getKeyword() + \"' operator\",\r\n            null);\r\n      }\r\n    }\r\n\r\n    int argIndex = 0;\r\n    for (final Value value : arguments) {\r\n      final String typeSignature = value.getType().getSignature();\r\n      signatureNormal.append(typeSignature);\r\n      if (argIndex == 0) {\r\n        signatureAnyLeft.append(ValueType.ANY.getSignature());\r\n      } else {\r\n        signatureAnyLeft.append(typeSignature);\r\n      }\r\n\r\n      if (argIndex == 1) {\r\n        signatureAnyRight.append(ValueType.ANY.getSignature());\r\n      } else {\r\n        signatureAnyRight.append(typeSignature);\r\n      }\r\n      argIndex++;\r\n    }\r\n\r\n    Method executeMethod = null;\r\n\r\n    try {\r\n      executeMethod = operator.getClass().getMethod(signatureNormal.toString(), methodArguments);\r\n    } catch (NoSuchMethodException ex) {\r\n      try {\r\n        executeMethod = operator.getClass().getMethod(signatureAnyLeft.toString(), methodArguments);\r\n      } catch (NoSuchMethodException ex2) {\r\n        try {\r\n          executeMethod =\r\n              operator.getClass().getMethod(signatureAnyRight.toString(), methodArguments);\r\n        } catch (NoSuchMethodException ex3) {\r\n          // DO NOTHING\r\n        }\r\n      }\r\n    }\r\n\r\n    if (executeMethod == null) {\r\n      throw context.makeException(\r\n          \"[Expression]Unsupported arguments detected for operator '\" + operator.getKeyword() +\r\n              \"' \" + Arrays.toString(arguments), null);\r\n    }\r\n\r\n    try {\r\n      return new ExpressionTreeElement((Value) executeMethod.invoke(operator, (Object[]) arguments),\r\n          stack, sources);\r\n    } catch (ArithmeticException arithEx) {\r\n      throw arithEx;\r\n    } catch (InvocationTargetException ex) {\r\n      final Throwable thr = ex.getTargetException();\r\n      if (thr instanceof ArithmeticException) {\r\n        throw (ArithmeticException) thr;\r\n      }\r\n      throw new RuntimeException(\r\n          \"Invocation exception during '\" + operator.getKeyword() + \"' processing\", thr);\r\n    } catch (Exception unexpected) {\r\n      throw context\r\n          .makeException(\"[Exception]Exception during '\" + operator.getKeyword() + \"' processing\",\r\n              unexpected);\r\n    }\r\n  }\r\n\r\n\r\n  private ExpressionTreeElement calculateTreeElement(final ExpressionTreeElement element,\r\n                                                     final PreprocessorContext context) {\r\n    ExpressionTreeElement treeElement = element;\r\n\r\n    switch (element.getItem().getExpressionItemType()) {\r\n      case VARIABLE: {\r\n        Objects.requireNonNull(context,\r\n            \"[Expression]Variable can't be used without context [\" + element.getItem().toString() +\r\n                ']');\r\n\r\n        final Variable var = (Variable) element.getItem();\r\n        final String name = var.getName();\r\n        final Value value = context.findVariableForName(name, false);\r\n        if (value == null) {\r\n          throw new RuntimeException(\"Unknown variable [\" + name + ']');\r\n        } else {\r\n          treeElement =\r\n              new ExpressionTreeElement(value, context.getPreprocessingState().makeIncludeStack(),\r\n                  context.getPreprocessingState().getLastReadString());\r\n        }\r\n      }\r\n      break;\r\n      case OPERATOR: {\r\n        treeElement = this.evalOperator(element, context);\r\n      }\r\n      break;\r\n      case FUNCTION: {\r\n        treeElement = this.evalFunction(element, context);\r\n      }\r\n      break;\r\n    }\r\n    return treeElement;\r\n  }\r\n\r\n\r\n  private Value eval(final PreprocessorContext context) {\r\n    if (expressionTree.isEmpty()) {\r\n      throw context.makeException(\"[Expression]The expression is empty\", null);\r\n    }\r\n    final ExpressionTreeElement result = calculateTreeElement(expressionTree.getRoot(), context);\r\n    final ExpressionItem resultItem = result.getItem();\r\n\r\n    if (resultItem == null) {\r\n      throw context.makeException(\"[Expression]Expression doesn't have result\", null);\r\n    }\r\n\r\n    if (resultItem instanceof Value) {\r\n      return (Value) resultItem;\r\n    } else {\r\n      throw context\r\n          .makeException(\"[Expression]The expression returns non-value result [\" + resultItem + ']',\r\n              null);\r\n    }\r\n  }\r\n\r\n}\r\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/ExpressionItem.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\n/**\n * The interface describes an object which can be used during expression\n * calculations\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic interface ExpressionItem {\n\n  /**\n   * Get the type of the item\n   *\n   * @return the item type\n   */\n  ExpressionItemType getExpressionItemType();\n\n  /**\n   * Get the priority of the item\n   *\n   * @return the item priority, must not be null\n   */\n  ExpressionItemPriority getExpressionItemPriority();\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/ExpressionItemPriority.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\npublic enum ExpressionItemPriority {\n\n  LOGICAL(0),\n  COMPARISON(1),\n  ARITHMETIC_ADD_SUB(2),\n  ARITHMETIC_MUL_DIV_MOD(3),\n  FUNCTION(5),\n  VALUE(6);\n\n  private final int priority;\n\n  ExpressionItemPriority(final int priority) {\n    this.priority = priority;\n  }\n\n  public int getPriority() {\n    return priority;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/ExpressionItemType.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\npublic enum ExpressionItemType {\n\n  FUNCTION,\n  OPERATOR,\n  VALUE,\n  VARIABLE,\n  SPECIAL\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/ExpressionParser.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\nimport static com.igormaznitsa.jcp.expression.ExpressionTreeElement.ANY_ARITY;\nimport static com.igormaznitsa.jcp.expression.ExpressionTreeElement.MAX_FUNCTION_ARGUMENTS;\nimport static java.util.Objects.requireNonNull;\nimport static java.util.Objects.requireNonNullElseGet;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\nimport com.igormaznitsa.jcp.expression.functions.AbstractFunction;\nimport com.igormaznitsa.jcp.expression.functions.FunctionDefinedByUser;\nimport com.igormaznitsa.jcp.expression.operators.AbstractOperator;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.IOException;\nimport java.io.PushbackReader;\nimport java.io.StringReader;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Set;\nimport java.util.stream.Collectors;\n\n/**\n * This class is a parser allows to parse an expression and make a tree as the output\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class ExpressionParser {\n\n  /**\n   * It contains the instance for the parser, because the parser is a singleton\n   */\n  private static final ExpressionParser INSTANCE = new ExpressionParser();\n\n  public static ExpressionParser getInstance() {\n    return INSTANCE;\n  }\n\n  private static boolean isDelimiterOrOperatorChar(final char chr) {\n    return isDelimiter(chr) || isOperatorChar(chr);\n  }\n\n  private static boolean isDelimiter(final char chr) {\n    switch (chr) {\n      case ',':\n      case '(':\n      case ')':\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  private static boolean isOperatorChar(final char chr) {\n    switch (chr) {\n      case '-':\n      case '+':\n      case '%':\n      case '*':\n      case '/':\n      case '&':\n      case '|':\n      case '!':\n      case '^':\n      case '=':\n      case '<':\n      case '>':\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  /**\n   * To parse an expression represented as a string and get a tree\n   *\n   * @param expressionStr the expression string to be parsed, must not be null\n   * @param context       a preprocessor context to be used to get variable values\n   * @return a tree containing parsed expression\n   * @throws IOException it will be thrown if there is a problem to read the expression string\n   */\n  public ExpressionTree parse(final String expressionStr, final PreprocessorContext context)\n      throws IOException {\n    requireNonNull(expressionStr, \"Expression is null\");\n\n    final PushbackReader reader = new PushbackReader(new StringReader(expressionStr));\n\n    final ExpressionTree result;\n    final PreprocessingState state = context.getPreprocessingState();\n    result = new ExpressionTree(state.makeIncludeStack(), state.getLastReadString());\n\n    if (this.readExpression(reader, result, context, false, false) != null) {\n      final String text = \"Unexpected result during parsing [\" + expressionStr + ']';\n      throw context.makeException(text, null);\n    }\n\n    result.postProcess();\n\n    return result;\n  }\n\n  /**\n   * It reads an expression from a reader and fill a tree\n   *\n   * @param reader     the reader to be used as the character source, must not be null\n   * @param tree       the result tree to be filled by read items, must not be null\n   * @param context    a preprocessor context to be used for variables\n   * @param inBrackets the flag shows that the expression can be ended by a bracket\n   * @param argument   the flag shows that the expression can be ended by a comma\n   * @return the last read expression item (a comma or a bracket for instance), it can be null\n   * @throws IOException it will be thrown if there is a problem in reading from the reader\n   */\n  public ExpressionItem readExpression(\n      final PushbackReader reader,\n      final ExpressionTree tree,\n      final PreprocessorContext context,\n      final boolean inBrackets,\n      final boolean argument\n  ) throws IOException {\n    boolean working = true;\n\n    ExpressionItem result = null;\n\n    final FilePositionInfo[] stack;\n    final String sourceLine;\n\n    final PreprocessingState state = context.getPreprocessingState();\n    stack = state.makeIncludeStack();\n    sourceLine = state.getLastReadString();\n\n    ExpressionItem prev = null;\n\n    while (working) {\n      final ExpressionItem nextItem = nextItem(reader, context);\n      if (nextItem == null) {\n        working = false;\n      } else if (nextItem.getExpressionItemType() == ExpressionItemType.SPECIAL) {\n        if (nextItem == SpecialItem.BRACKET_CLOSING) {\n          if (inBrackets) {\n            working = false;\n            result = nextItem;\n          } else if (argument) {\n            working = false;\n            result = nextItem;\n          } else {\n            final String text = \"Detected alone closing bracket\";\n            throw context.makeException(\"Detected alone closing bracket\", null);\n          }\n        } else if (nextItem == SpecialItem.BRACKET_OPENING) {\n          if (prev != null && prev.getExpressionItemType() == ExpressionItemType.VARIABLE) {\n            final String text = \"Unknown function detected [\" + prev + ']';\n            throw context.makeException(text, null);\n          }\n\n          final ExpressionTree subExpression;\n          subExpression = new ExpressionTree(stack, sourceLine);\n          if (SpecialItem.BRACKET_CLOSING !=\n              readExpression(reader, subExpression, context, true, false)) {\n            final String text = \"Detected unclosed bracket\";\n            throw context.makeException(text, null);\n          }\n          tree.addTree(subExpression);\n        } else if (nextItem == SpecialItem.COMMA) {\n          return nextItem;\n        }\n      } else if (nextItem.getExpressionItemType() == ExpressionItemType.FUNCTION) {\n        final AbstractFunction function = (AbstractFunction) nextItem;\n        tree.addTree(this.readFunction(function, reader, context, stack, sourceLine));\n      } else {\n        tree.addItem(nextItem);\n      }\n      prev = nextItem;\n    }\n    return result;\n  }\n\n  /**\n   * The auxiliary method allows to form a function and its arguments as a tree\n   *\n   * @param function     the function which arguments will be read from the stream, must not be null\n   * @param reader       the reader to be used as the character source, must not be null\n   * @param context      a preprocessor context, it will be used for a user functions and variables\n   * @param includeStack the current file include stack, can be null\n   * @param sources      the current source line, can be null\n   * @return an expression tree containing parsed function arguments\n   * @throws IOException it will be thrown if there is any problem to read chars\n   */\n  private ExpressionTree readFunction(\n      final AbstractFunction function,\n      final PushbackReader reader,\n      final PreprocessorContext context,\n      final FilePositionInfo[] includeStack,\n      final String sources)\n      throws IOException {\n    final ExpressionItem expectedBracket = nextItem(reader, context);\n    if (expectedBracket == null) {\n      throw context\n          .makeException(\"Detected function without params [\" + function.getName() + ']', null);\n    }\n\n    final Set<Integer> arities = function.getArity();\n    final int maxArity = arities.contains(ANY_ARITY) ? MAX_FUNCTION_ARGUMENTS :\n        arities.stream().mapToInt(x -> x).max().orElse(0);\n\n    ExpressionTree functionTree;\n    if (maxArity == 0) {\n      final ExpressionTree subExpression = new ExpressionTree(includeStack, sources);\n      final ExpressionItem lastItem =\n          readFunctionArgument(reader, subExpression, context, includeStack, sources);\n      if (SpecialItem.BRACKET_CLOSING != lastItem) {\n        throw context\n            .makeException(\"There is not closing bracket for function [\" + function.getName() + ']',\n                null);\n      } else if (!subExpression.getRoot().isEmptySlot()) {\n        throw context\n            .makeException(\"The function '\" + function.getName() + \"' doesn't need arguments\",\n                null);\n      } else {\n        functionTree = new ExpressionTree(includeStack, sources);\n        functionTree.addItem(function);\n      }\n    } else {\n      final List<ExpressionTree> arguments = new ArrayList<>();\n      for (int i = 0; i < maxArity; i++) {\n        final ExpressionTree subExpression = new ExpressionTree(includeStack, sources);\n        final ExpressionItem lastItem =\n            readFunctionArgument(reader, subExpression, context, includeStack, sources);\n\n        if (SpecialItem.BRACKET_CLOSING == lastItem) {\n          arguments.add(subExpression);\n          break;\n        } else if (SpecialItem.COMMA == lastItem) {\n          arguments.add(subExpression);\n        } else {\n          throw context\n              .makeException(\"Error argument for function '\" + function.getName() + '\\'', null);\n        }\n      }\n\n      functionTree = new ExpressionTree(includeStack, sources);\n      functionTree.addItem(function);\n      ExpressionTreeElement functionTreeElement = functionTree.getRoot();\n\n      final Set<Integer> expectedArities = functionTreeElement.getExpectedArities();\n      if (!expectedArities.contains(ANY_ARITY) && !expectedArities.contains(arguments.size())) {\n        throw context.makeException(\n            \"Wrong argument number detected for '\" + function.getName() + \"', expected \" +\n                function.getArity().stream().map(Object::toString)\n                    .collect(Collectors.joining(\";\")) + \" argument(s)\", null);\n      }\n\n      functionTreeElement.fillArguments(arguments);\n    }\n    return functionTree;\n  }\n\n  /**\n   * The auxiliary method allows to read a function argument\n   *\n   * @param reader    a reader to be the character source, must not be null\n   * @param tree      the result tree to be filled by read items, must not be null\n   * @param context   a preprocessor context\n   * @param callStack the current file call stack, can be null\n   * @param source    the current source line, can be null\n   * @return the last read expression item (a comma or a bracket)\n   * @throws IOException it will be thrown if there is any error during char reading from the reader\n   */\n  ExpressionItem readFunctionArgument(final PushbackReader reader, final ExpressionTree tree,\n                                      final PreprocessorContext context,\n                                      final FilePositionInfo[] callStack, final String source)\n      throws IOException {\n    boolean working = true;\n    ExpressionItem result = null;\n    while (working) {\n      final ExpressionItem nextItem = nextItem(reader, context);\n      if (nextItem == null) {\n        throw context.makeException(\"Non-closed function detected\", null);\n      } else if (SpecialItem.COMMA == nextItem) {\n        result = nextItem;\n        working = false;\n      } else if (SpecialItem.BRACKET_OPENING == nextItem) {\n        final ExpressionTree subExpression = new ExpressionTree(callStack, source);\n        if (SpecialItem.BRACKET_CLOSING !=\n            readExpression(reader, subExpression, context, true, false)) {\n          throw context\n              .makeException(\"Non-closed bracket inside a function argument detected\", null);\n        }\n        tree.addTree(subExpression);\n      } else if (SpecialItem.BRACKET_CLOSING == nextItem) {\n        result = nextItem;\n        working = false;\n      } else if (nextItem.getExpressionItemType() == ExpressionItemType.FUNCTION) {\n        final AbstractFunction function = (AbstractFunction) nextItem;\n        ExpressionTree functionTree = readFunction(function, reader, context, callStack, source);\n        tree.addTree(functionTree);\n      } else {\n        tree.addItem(nextItem);\n      }\n    }\n    return result;\n  }\n\n  private int hex2int(final PreprocessorContext context, final char chr) {\n    final int result;\n    if (Character.isDigit(chr)) {\n      result = chr - '0';\n    } else {\n      result = 10 + (chr - Character.toLowerCase(chr) - 'a');\n      if (result < 10 || result > 15) {\n        throw context.makeException(\"Unexpected hex digit detected: \" + chr, null);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Read the next item from the reader\n   *\n   * @param reader  a reader to be used as the char source, must not be null\n   * @param context a preprocessor context\n   * @return a read expression item, it can be null if the end is reached\n   * @throws IOException it will be thrown if there is any error during a char reading\n   */\n  ExpressionItem nextItem(final PushbackReader reader, final PreprocessorContext context)\n      throws IOException {\n    requireNonNull(reader, \"Reader is null\");\n\n    ParserState state = ParserState.WAIT;\n    final StringBuilder builder = new StringBuilder(12);\n\n    boolean found = false;\n    char unicodeChar = 0;\n\n    while (!found) {\n      final int data = reader.read();\n\n      if (data < 0) {\n        if (state != ParserState.WAIT) {\n          found = true;\n        }\n        break;\n      }\n\n      final char chr = (char) data;\n\n      switch (state) {\n        case WAIT: {\n          if (Character.isWhitespace(chr)) {\n            // do nothing\n          } else if (chr == ',') {\n            return SpecialItem.COMMA;\n          } else if (chr == '(') {\n            return SpecialItem.BRACKET_OPENING;\n          } else if (chr == ')') {\n            return SpecialItem.BRACKET_CLOSING;\n          } else if (Character.isDigit(chr)) {\n            builder.append(chr);\n            if (chr == '0') {\n              state = ParserState.HEX_NUMBER;\n            } else {\n              state = ParserState.NUMBER;\n            }\n          } else if (chr == '.') {\n            builder.append('.');\n            state = ParserState.FLOAT_NUMBER;\n          } else if (Character.isLetter(chr) || chr == '$' || chr == '_') {\n            builder.append(chr);\n            state = ParserState.VALUE_OR_FUNCTION;\n          } else if (chr == '\\\"') {\n            state = ParserState.STRING;\n          } else if (isOperatorChar(chr)) {\n            builder.append(chr);\n            state = ParserState.OPERATOR;\n          } else {\n            throw context\n                .makeException(\"Unsupported token character detected '\" + chr + '\\'', null);\n          }\n        }\n        break;\n        case OPERATOR: {\n          if (!isOperatorChar(chr) || isDelimiter(chr)) {\n            reader.unread(data);\n            found = true;\n          } else {\n            builder.append(chr);\n          }\n        }\n        break;\n        case FLOAT_NUMBER: {\n          if (Character.isDigit(chr)) {\n            builder.append(chr);\n          } else {\n            found = true;\n            reader.unread(data);\n          }\n        }\n        break;\n        case HEX_NUMBER: {\n          if (builder.length() == 1) {\n            if (chr == 'X' || chr == 'x') {\n              builder.append(chr);\n            } else if (chr == '.') {\n              builder.append(chr);\n              state = ParserState.FLOAT_NUMBER;\n            } else if (Character.isDigit(chr)) {\n              state = ParserState.NUMBER;\n            } else {\n              state = ParserState.NUMBER;\n              found = true;\n              reader.unread(data);\n            }\n          } else if (Character.isDigit(chr) || (chr >= 'a' && chr <= 'f') ||\n              (chr >= 'A' && chr <= 'F')) {\n            builder.append(chr);\n          } else {\n            found = true;\n            reader.unread(data);\n          }\n        }\n        break;\n        case UNICODE_DIGIT0:\n          unicodeChar = (char) (hex2int(context, chr) << 12);\n          state = ParserState.UNICODE_DIGIT1;\n          break;\n        case UNICODE_DIGIT1:\n          unicodeChar = (char) (unicodeChar | (hex2int(context, chr) << 8));\n          state = ParserState.UNICODE_DIGIT2;\n          break;\n        case UNICODE_DIGIT2:\n          unicodeChar = (char) (unicodeChar | (hex2int(context, chr) << 4));\n          state = ParserState.UNICODE_DIGIT3;\n          break;\n        case UNICODE_DIGIT3:\n          unicodeChar = (char) (unicodeChar | hex2int(context, chr));\n          state = ParserState.STRING;\n          builder.append(unicodeChar);\n          break;\n        case NUMBER: {\n          if (Character.isDigit(chr)) {\n            builder.append(chr);\n          } else if (chr == '.') {\n            builder.append(chr);\n            state = ParserState.FLOAT_NUMBER;\n          } else {\n            reader.unread(data);\n            found = true;\n          }\n        }\n        break;\n        case VALUE_OR_FUNCTION: {\n          if (Character.isWhitespace(chr) || isDelimiterOrOperatorChar(chr)) {\n            reader.unread(data);\n            found = true;\n          } else {\n            builder.append(chr);\n          }\n        }\n        break;\n        case SPECIAL_CHAR: {\n          switch (chr) {\n            case 'n':\n              builder.append('\\n');\n              break;\n            case 't':\n              builder.append('\\t');\n              break;\n            case 'b':\n              builder.append('\\b');\n              break;\n            case 'f':\n              builder.append('\\f');\n              break;\n            case 'r':\n              builder.append('\\r');\n              break;\n            case '\\\\':\n              builder.append('\\\\');\n              break;\n            case '\\\"':\n              builder.append('\\\"');\n              break;\n            case '\\'':\n              builder.append('\\'');\n              break;\n            case 'u':\n              state = ParserState.UNICODE_DIGIT0;\n              break;\n            default: {\n              throw context\n                  .makeException(\"Unsupported special char detected '\\\\\" + chr + '\\'', null);\n            }\n          }\n          state = state == ParserState.SPECIAL_CHAR ? ParserState.STRING : state;\n        }\n        break;\n        case STRING: {\n          switch (chr) {\n            case '\\\"': {\n              found = true;\n            }\n            break;\n            case '\\\\': {\n              state = ParserState.SPECIAL_CHAR;\n            }\n            break;\n            default: {\n              builder.append(chr);\n            }\n            break;\n          }\n        }\n        break;\n        default:\n          throw new Error(\"Unsupported parser state [\" + state.name() + ']');\n      }\n    }\n\n    if (!found) {\n      switch (state) {\n        case UNICODE_DIGIT0:\n        case UNICODE_DIGIT1:\n        case UNICODE_DIGIT2: {\n          throw context.makeException(\"Non-completed unicode char has been detected\", null);\n        }\n        case SPECIAL_CHAR:\n        case STRING: {\n          throw context.makeException(\"Non-closed string has been detected\", null);\n        }\n        default:\n          return null;\n      }\n    } else {\n      ExpressionItem result = null;\n      switch (state) {\n        case FLOAT_NUMBER: {\n          result = Value.valueOf(Float.parseFloat(builder.toString()));\n        }\n        break;\n        case HEX_NUMBER: {\n          final String text = builder.toString();\n          if (\"0\".equals(text)) {\n            result = Value.INT_ZERO;\n          } else {\n            final String str = PreprocessorUtils.extractTail(\"0x\", text);\n            result = Value.valueOf(Long.parseLong(str, 16));\n          }\n        }\n        break;\n        case NUMBER: {\n          result = Value.valueOf(Long.parseLong(builder.toString()));\n        }\n        break;\n        case OPERATOR: {\n          final String operatorLC = builder.toString().toLowerCase(Locale.ROOT);\n          for (final AbstractOperator operator : AbstractOperator.getAllOperators()) {\n            if (operator.getKeyword().equals(operatorLC)) {\n              result = operator;\n              break;\n            }\n          }\n\n          if (result == null) {\n            throw context.makeException(\"Unknown operator detected '\" + operatorLC + '\\'', null);\n          }\n        }\n        break;\n        case STRING: {\n          result = Value.valueOf(builder.toString());\n        }\n        break;\n        case VALUE_OR_FUNCTION: {\n          final String str = builder.toString().toLowerCase();\n          if (str.charAt(0) == '$') {\n\n            requireNonNull(context,\n                \"There is not a preprocessor context to define a user function [\" + str + ']');\n\n            final List<PreprocessorExtension> extensions = context.getPreprocessorExtensions();\n            if (extensions.isEmpty()) {\n              throw context.makeException(\n                  \"There is not any defined preprocessor extension to get data about user functions [\" +\n                      str + ']', null);\n            }\n\n            final String userFunctionName = PreprocessorUtils.extractTail(\"$\", str);\n\n            final PreprocessorExtension preprocessorExtension =\n                context.getPreprocessorExtensions().stream()\n                    .filter(x -> x.isAllowed(context))\n                    .filter(x -> x.hasUserFunction(userFunctionName,\n                        Set.of()))\n                    .findFirst().orElse(null);\n\n            if (preprocessorExtension == null) {\n              throw context.makeException(\n                  \"Can't find any preprocessor extension processing the user functions [\" +\n                      userFunctionName + ']', null);\n            } else {\n              final Set<Integer> arities =\n                  preprocessorExtension.getUserFunctionArity(userFunctionName);\n              if (arities.isEmpty()) {\n                throw context.makeException(\n                    \"Empty arity set for preprocessor extension processing the user functions [\" +\n                        userFunctionName + ']', null);\n              }\n              result = new FunctionDefinedByUser(userFunctionName, arities, context);\n            }\n          } else if (\"true\".equals(str)) {\n            result = Value.BOOLEAN_TRUE;\n          } else if (\"false\".equals(str)) {\n            result = Value.BOOLEAN_FALSE;\n          } else {\n            final AbstractFunction function = AbstractFunction.findForName(str);\n            result = requireNonNullElseGet(function, () -> new Variable(str));\n          }\n        }\n        break;\n        default: {\n          throw new Error(\"Unsupported final parser state detected [\" + state.name() + ']');\n        }\n      }\n      return result;\n    }\n  }\n\n  /**\n   * Internal parser states.\n   */\n  private enum ParserState {\n\n    WAIT,\n    NUMBER,\n    HEX_NUMBER,\n    FLOAT_NUMBER,\n    STRING,\n    SPECIAL_CHAR,\n    UNICODE_DIGIT0,\n    UNICODE_DIGIT1,\n    UNICODE_DIGIT2,\n    UNICODE_DIGIT3,\n    VALUE_OR_FUNCTION,\n    OPERATOR\n  }\n\n  /**\n   * The enumeration describes some special items which can be met in the expression\n   *\n   * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n   */\n  public enum SpecialItem implements ExpressionItem {\n\n    BRACKET_OPENING,\n    BRACKET_CLOSING,\n    COMMA;\n\n    SpecialItem() {\n    }\n\n    @Override\n    public ExpressionItemPriority getExpressionItemPriority() {\n      return null;\n    }\n\n    @Override\n    public ExpressionItemType getExpressionItemType() {\n      return ExpressionItemType.SPECIAL;\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/ExpressionTree.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport java.util.Objects;\n\n/**\n * The class describes an object contains an expression tree\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ExpressionTree {\n\n  private final FilePositionInfo[] includeStack;\n  private final String sources;\n  private ExpressionTreeElement last = ExpressionTreeElement.EMPTY_SLOT;\n\n  public ExpressionTree() {\n    this(null, null);\n  }\n\n  public ExpressionTree(final FilePositionInfo[] callStack, final String sources) {\n    this.includeStack = callStack == null ? PreprocessingState.EMPTY_STACK : callStack;\n    this.sources = sources == null ? \"\" : sources;\n  }\n\n  /**\n   * Allows to check that the tree is empty\n   *\n   * @return true if the tree is empty one else false\n   */\n  public boolean isEmpty() {\n    return last.isEmptySlot();\n  }\n\n  /**\n   * Add new expression item into tree\n   *\n   * @param item an item to be added, must not be null\n   */\n  public void addItem(final ExpressionItem item) {\n    if (item == null) {\n      throw new PreprocessorException(\n          \"[Expression]Item is null\",\n          this.sources,\n          this.includeStack,\n          null);\n    }\n\n    if (this.last.isEmptySlot()) {\n      this.last = new ExpressionTreeElement(item, this.includeStack, this.sources);\n    } else {\n      this.last = this.last.addTreeElement(\n          new ExpressionTreeElement(item, this.includeStack, this.sources));\n    }\n  }\n\n  /**\n   * Add whole tree as a tree element, also it sets the maximum priority to the new element\n   *\n   * @param tree a tree to be added as an item, must not be null\n   */\n  public void addTree(final ExpressionTree tree) {\n    Objects.requireNonNull(tree, \"Tree is null\");\n    if (last.isEmptySlot()) {\n      final ExpressionTreeElement thatTreeRoot = tree.getRoot();\n      if (!thatTreeRoot.isEmptySlot()) {\n        last = thatTreeRoot;\n        last.makeMaxPriority();\n      }\n    } else {\n      last = last.addSubTree(tree);\n    }\n  }\n\n  /**\n   * Get the root of the tree\n   *\n   * @return the root of the tree or EMPTY_SLOT if the tree is empty\n   */\n  public ExpressionTreeElement getRoot() {\n    if (last.isEmptySlot()) {\n      return this.last;\n    } else {\n      ExpressionTreeElement element = last;\n      while (!Thread.currentThread().isInterrupted()) {\n        final ExpressionTreeElement next = element.getParent();\n        if (next == null) {\n          return element;\n        } else {\n          element = next;\n        }\n      }\n    }\n    return ExpressionTreeElement.EMPTY_SLOT;\n  }\n\n  /**\n   * It can be called after the tree has been formed to optimize inside structures\n   */\n  public void postProcess() {\n    final ExpressionTreeElement root = getRoot();\n    if (!root.isEmptySlot()) {\n      root.postProcess();\n    }\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/ExpressionTreeElement.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\nimport static com.igormaznitsa.jcp.expression.functions.AbstractFunction.ARITY_0;\n\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.functions.AbstractFunction;\nimport com.igormaznitsa.jcp.expression.operators.AbstractOperator;\nimport com.igormaznitsa.jcp.expression.operators.OperatorSUB;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.stream.Collectors;\n\n/**\n * The class describes a wrapper around an expression item to be saved into an expression tree\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class ExpressionTreeElement {\n\n  public static final ExpressionTreeElement EMPTY_SLOT = new ExpressionTreeElement();\n\n  /**\n   * Inside constant to be used for speed up some operations\n   */\n  private static final OperatorSUB OPERATOR_SUB = AbstractOperator.findForClass(OperatorSUB.class);\n  /**\n   * Empty array to avoid unnecessary operations\n   */\n  private static final ExpressionTreeElement[] EMPTY = new ExpressionTreeElement[0];\n  public static final int ANY_ARITY = -1;\n  public static final int MAX_FUNCTION_ARGUMENTS = 256;\n  /**\n   * Contains the source string for the expression.\n   */\n  private final String sourceString;\n  /**\n   * Current include stack of the preprocessor to the source string.\n   */\n  private final FilePositionInfo[] includeStack;\n  /**\n   * The variable contains the wrapped expression item\n   */\n  private ExpressionItem savedItem;\n  /**\n   * The array contains links to the tree element children\n   */\n  private ExpressionTreeElement[] childrenSlots;\n  /**\n   * The link to the parent element, if it is the tree root then it contains null\n   */\n  private ExpressionTreeElement parentTreeElement;\n  /**\n   * The priority of the tree element, it is very strongly used during tree sorting\n   */\n  private int priority;\n  /**\n   * Because I fill children sequentially, the variable contains the index of the first empty child slot\n   */\n  private int nextChildSlotIndex = 0;\n  /**\n   * Set of allowed arities.\n   *\n   * @since 7.3.0\n   */\n  private Set<Integer> expectedArities = Set.of();\n\n  @Override\n  public String toString() {\n    return \"ExpressionTreeElement(item=\" + this.savedItem + \",slots=\" + childrenSlots.length + \")\";\n  }\n\n  private ExpressionTreeElement() {\n    this.sourceString = \"\";\n    this.includeStack = new FilePositionInfo[0];\n  }\n\n  /**\n   * The constructor\n   *\n   * @param item         an expression item to be wrapped\n   * @param callStack    current call stack\n   * @param sourceString source string for the expression\n   */\n  ExpressionTreeElement(final ExpressionItem item, final FilePositionInfo[] callStack,\n                        final String sourceString) {\n    this.sourceString = sourceString;\n    this.includeStack = callStack;\n\n    if (item == null) {\n      throw new PreprocessorException(\"[Expression]The item is null\", this.sourceString,\n          this.includeStack, null);\n    }\n    if (item.getExpressionItemType() == ExpressionItemType.OPERATOR) {\n      final int arity = ((AbstractOperator) item).getArity();\n      this.expectedArities = Set.of(arity);\n      this.childrenSlots = new ExpressionTreeElement[arity];\n    } else if (item.getExpressionItemType() == ExpressionItemType.FUNCTION) {\n      final AbstractFunction functionItem = (AbstractFunction) item;\n      this.expectedArities = functionItem.getArity();\n      final int arity = this.expectedArities.stream().mapToInt(x -> x).max().orElse(0);\n      this.childrenSlots = this.expectedArities.contains(ANY_ARITY) ?\n          new ExpressionTreeElement[MAX_FUNCTION_ARGUMENTS] : new ExpressionTreeElement[arity];\n    } else {\n      this.expectedArities = ARITY_0;\n      this.childrenSlots = EMPTY;\n    }\n    this.priority = item.getExpressionItemPriority().getPriority();\n    this.savedItem = item;\n    Arrays.fill(this.childrenSlots, EMPTY_SLOT);\n  }\n\n  /**\n   * Get effective child slots.\n   *\n   * @return list of non-empty child slots.\n   * @since 7.3.0\n   */\n  public List<ExpressionTreeElement> extractEffectiveChildren() {\n    return Arrays.stream(this.childrenSlots).takeWhile(x -> x != EMPTY_SLOT)\n        .collect(Collectors.toUnmodifiableList());\n  }\n\n  /**\n   * Variants of allowed arities by the expression tree element\n   *\n   * @return set contains number of expected arities\n   * @since 7.3.0\n   */\n  public Set<Integer> getExpectedArities() {\n    return this.expectedArities;\n  }\n\n  /**\n   * Allows to check that the element is EMPTY_SLOT\n   *\n   * @return true if the element is empty slot, false otherwise\n   */\n  public boolean isEmptySlot() {\n    return EMPTY_SLOT == this;\n  }\n\n  private void assertNotEmptySlot() {\n    if (this.isEmptySlot()) {\n      throw new UnsupportedOperationException(\"Unsupported operation for empty slot\");\n    }\n  }\n\n  /**\n   * Internal auxiliary function to set the maximum priority the element\n   */\n  void makeMaxPriority() {\n    this.priority = ExpressionItemPriority.VALUE.getPriority();\n  }\n\n  /**\n   * Get the wrapped item\n   *\n   * @return the item to be wrapped by the object\n   */\n\n  public ExpressionItem getItem() {\n    return this.savedItem;\n  }\n\n  /**\n   * Get the parent for the element\n   *\n   * @return the parent for the element or null if the element is the tree root\n   */\n\n  public ExpressionTreeElement getParent() {\n    return this.parentTreeElement;\n  }\n\n  /**\n   * Get the current priority of the element\n   *\n   * @return the priority\n   */\n  public int getPriority() {\n    return this.priority;\n  }\n\n  /**\n   * Add a tree as new child and make the maximum priority for it\n   *\n   * @param tree a tree to be added as a child, must not be null\n   * @return it returns this\n   */\n\n  public ExpressionTreeElement addSubTree(final ExpressionTree tree) {\n    assertNotEmptySlot();\n\n    final ExpressionTreeElement root = tree.getRoot();\n    if (!root.isEmptySlot()) {\n      root.makeMaxPriority();\n      addElementToNextFreeSlot(root);\n    }\n    return this;\n  }\n\n  /**\n   * It replaces a child element\n   *\n   * @param oldOne the old expression element to be replaced (must not be null)\n   * @param newOne the new expression element to be used instead the old one (must not be null)\n   * @return true if the element was found and replaced, else false\n   */\n  public boolean replaceElement(final ExpressionTreeElement oldOne,\n                                final ExpressionTreeElement newOne) {\n    assertNotEmptySlot();\n\n    if (oldOne == null) {\n      throw new PreprocessorException(\"[Expression]The old element is null\", this.sourceString,\n          this.includeStack, null);\n    }\n\n    if (newOne == null) {\n      throw new PreprocessorException(\"[Expression]The new element is null\", this.sourceString,\n          this.includeStack, null);\n    }\n\n    boolean replaced = false;\n    for (int i = 0; i < this.childrenSlots.length; i++) {\n      if (this.childrenSlots[i] == oldOne) {\n        this.childrenSlots[i] = newOne;\n        newOne.parentTreeElement = this;\n        replaced = true;\n        break;\n      }\n    }\n    return replaced;\n  }\n\n  /**\n   * Get the child element for its index (the first is 0)\n   *\n   * @param index the index of the needed child\n   * @return the child or EMPTY_SLOT\n   * @throws ArrayIndexOutOfBoundsException it will be thrown if an impossible index is being used\n   * @see #EMPTY_SLOT\n   */\n\n  public ExpressionTreeElement getChildForIndex(final int index) {\n    assertNotEmptySlot();\n    return this.childrenSlots[index];\n  }\n\n  /**\n   * Add tree element with sorting operation depends on priority of the elements\n   *\n   * @param element the element to be added, must not be null\n   * @return the element which should be used as the last for the current tree\n   */\n\n  public ExpressionTreeElement addTreeElement(final ExpressionTreeElement element) {\n    assertNotEmptySlot();\n    Objects.requireNonNull(element, \"The element is null\");\n\n    final int newElementPriority = element.getPriority();\n    ExpressionTreeElement result = this;\n    final ExpressionTreeElement parentTreeElement = this.parentTreeElement;\n    final int currentPriority = getPriority();\n\n    if (newElementPriority < currentPriority) {\n      if (parentTreeElement == null) {\n        element.addTreeElement(this);\n        result = element;\n      } else {\n        result = parentTreeElement.addTreeElement(element);\n      }\n    } else if (newElementPriority == currentPriority) {\n      if (parentTreeElement != null) {\n        parentTreeElement.replaceElement(this, element);\n      }\n      if (element.nextChildSlotIndex >= element.childrenSlots.length) {\n        throw new PreprocessorException(\n            \"[Expression] Can't add slot data, may be wrong number of arguments, slot index is \" +\n                element.nextChildSlotIndex +\n                \" but maximum slots is \" + element.childrenSlots.length,\n            this.sourceString, this.includeStack, null);\n      }\n      element.childrenSlots[element.nextChildSlotIndex++] = this;\n      this.parentTreeElement = element;\n      result = element;\n    } else if (this.isFull()) {\n      final int lastElementIndex = this.nextChildSlotIndex - 1;\n      final ExpressionTreeElement lastElement = this.childrenSlots[lastElementIndex];\n      if (lastElement.getPriority() > newElementPriority) {\n        element.addElementToNextFreeSlot(lastElement);\n        this.childrenSlots[lastElementIndex] = element;\n        element.parentTreeElement = this;\n        result = element;\n      }\n\n    } else {\n      addElementToNextFreeSlot(element);\n      result = element;\n    }\n    return result;\n  }\n\n  /**\n   * It allows to check that all children slots have been filled\n   *\n   * @return true if there is not any free child slot else false\n   */\n  public boolean isFull() {\n    return this.nextChildSlotIndex >= this.childrenSlots.length;\n  }\n\n  /**\n   * It fills children slots from a list containing expression trees\n   *\n   * @param arguments the list containing trees to be used as children\n   */\n  public void fillArguments(final List<ExpressionTree> arguments) {\n    assertNotEmptySlot();\n\n    if (arguments == null) {\n      throw new PreprocessorException(\"[Expression]Argument list is null\", this.sourceString,\n          this.includeStack, null);\n    }\n\n    if (!this.expectedArities.contains(ANY_ARITY) &&\n        !this.expectedArities.contains(arguments.size())) {\n      throw new PreprocessorException(\n          \"Wrong argument list size, expected arities: \" + this.expectedArities, this.sourceString,\n          this.includeStack, null);\n    }\n\n    int i = 0;\n    for (ExpressionTree arg : arguments) {\n      if (arg == null) {\n        throw new PreprocessorException(\"[Expression]Argument [\" + (i + 1) + \"] is null\",\n            this.sourceString, this.includeStack, null);\n      }\n\n      if (!childrenSlots[i].isEmptySlot()) {\n        throw new PreprocessorException(\n            \"[Expression]Non-empty slot detected, it is possible that there is a program error, contact a developer please\",\n            this.sourceString, this.includeStack, null);\n      }\n\n      final ExpressionTreeElement root = arg.getRoot();\n      if (root.isEmptySlot()) {\n        throw new PreprocessorException(\"[Expression]Empty argument [\" + (i + 1) + \"] detected\",\n            this.sourceString, this.includeStack, null);\n      }\n      childrenSlots[i] = root;\n      root.parentTreeElement = this;\n\n      i++;\n    }\n  }\n\n  /**\n   * Add an expression element into the next free child slot\n   *\n   * @param element an element to be added, must not be null\n   */\n  private void addElementToNextFreeSlot(final ExpressionTreeElement element) {\n    if (element == null) {\n      throw new PreprocessorException(\"[Expression]Element is null\", this.sourceString,\n          this.includeStack, null);\n    }\n\n    if (this.childrenSlots.length == 0) {\n      throw new PreprocessorException(\n          \"[Expression]Unexpected element, may be unknown function [\" + savedItem.toString() + ']',\n          this.sourceString, this.includeStack, null);\n    } else if (isFull()) {\n      throw new PreprocessorException(\n          \"[Expression]There is not any possibility to add new argument [\" + savedItem.toString() +\n              ']', this.sourceString, this.includeStack, null);\n    } else {\n      childrenSlots[nextChildSlotIndex++] = element;\n    }\n    element.parentTreeElement = this;\n  }\n\n  /**\n   * Post-processing after the tree is formed, the unary minus operation will be optimized\n   */\n  public void postProcess() {\n    if (!this.isEmptySlot()) {\n\n      switch (savedItem.getExpressionItemType()) {\n        case OPERATOR: {\n          if (savedItem == OPERATOR_SUB) {\n            if (!this.childrenSlots[0].isEmptySlot() && this.childrenSlots[1].isEmptySlot()) {\n              final ExpressionTreeElement left = this.childrenSlots[0];\n              final ExpressionItem item = left.getItem();\n              if (item.getExpressionItemType() == ExpressionItemType.VALUE) {\n                final Value val = (Value) item;\n                switch (val.getType()) {\n                  case INT: {\n                    this.childrenSlots = EMPTY;\n                    this.savedItem = Value.valueOf(-val.asLong());\n                    makeMaxPriority();\n                  }\n                  break;\n                  case FLOAT: {\n                    this.childrenSlots = EMPTY;\n                    this.savedItem = Value.valueOf(0.0f - val.asFloat());\n                    makeMaxPriority();\n                  }\n                  break;\n                  default: {\n                    if (!left.isEmptySlot()) {\n                      left.postProcess();\n                    }\n                  }\n                  break;\n                }\n              }\n            } else {\n              for (final ExpressionTreeElement element : this.childrenSlots) {\n                if (!element.isEmptySlot()) {\n                  element.postProcess();\n                }\n              }\n            }\n          } else {\n            for (final ExpressionTreeElement element : this.childrenSlots) {\n              if (!element.isEmptySlot()) {\n                element.postProcess();\n              }\n            }\n          }\n        }\n        break;\n        case FUNCTION: {\n          for (final ExpressionTreeElement element : this.childrenSlots) {\n            if (!element.isEmptySlot()) {\n              element.postProcess();\n            }\n          }\n        }\n        break;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/Value.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.Objects;\n\n/**\n * The class describes an expression value i.e. an atomic constant expression item like string or number\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n * @see ValueType\n */\npublic final class Value implements ExpressionItem {\n\n  public static final Value BOOLEAN_TRUE = new Value(Boolean.TRUE);\n  public static final Value BOOLEAN_FALSE = new Value(Boolean.FALSE);\n\n  public static final Value INT_ZERO = new Value(0L);\n  public static final Value INT_ONE = new Value(1L);\n  public static final Value INT_TWO = new Value(2L);\n  public static final Value INT_THREE = new Value(3L);\n  public static final Value INT_FOUR = new Value(4L);\n  public static final Value INT_FIVE = new Value(5L);\n\n  private final Object value;\n  private final ValueType type;\n\n  private Value(final String val) {\n    value = val == null ? \"null\" : val;\n    type = ValueType.STRING;\n  }\n\n  private Value(final Long val) {\n    value = val;\n    type = ValueType.INT;\n  }\n\n  private Value(final Float val) {\n    value = val;\n    type = ValueType.FLOAT;\n  }\n\n  private Value(final Boolean val) {\n    value = val;\n    type = ValueType.BOOLEAN;\n  }\n\n\n  public static Value valueOf(final Long val) {\n    return new Value(val);\n  }\n\n\n  public static Value valueOf(final Boolean val) {\n    return val ? BOOLEAN_TRUE : BOOLEAN_FALSE;\n  }\n\n\n  public static Value valueOf(final Float val) {\n    return new Value(val);\n  }\n\n\n  public static Value valueOf(final String val) {\n    return new Value(val);\n  }\n\n\n  public static Value recognizeRawString(final String str) {\n    Objects.requireNonNull(str, \"Parameter is null\");\n\n    if (\"true\".equals(str)) {\n      return Value.BOOLEAN_TRUE;\n    }\n\n    if (\"false\".equals(str)) {\n      return Value.BOOLEAN_FALSE;\n    }\n\n    try {\n      return new Value(Long.parseLong(str));\n    } catch (NumberFormatException ex) {\n      // DO NOTHING\n    }\n\n    try {\n      return new Value(Float.parseFloat(str));\n    } catch (NumberFormatException ex) {\n      // DO NOTHING\n    }\n\n    return new Value(str);\n  }\n\n\n  public static Value recognizeOf(final String str) {\n    final ValueType type = recognizeType(str);\n\n    final Value result;\n\n    switch (type) {\n      case BOOLEAN: {\n        result = \"true\".equalsIgnoreCase(str) ? BOOLEAN_TRUE : BOOLEAN_FALSE;\n      }\n      break;\n      case INT: {\n        result = new Value((Long) getValue(str, ValueType.INT));\n      }\n      break;\n      case FLOAT: {\n        result = new Value((Float) getValue(str, ValueType.FLOAT));\n      }\n      break;\n      case STRING: {\n        result = new Value((String) getValue(str, ValueType.STRING));\n      }\n      break;\n      default: {\n        throw new IllegalArgumentException(\"Illegal value [\" + str + ']');\n      }\n    }\n\n    return result;\n  }\n\n\n  public static Object getValue(final String value, final ValueType type) {\n    try {\n      switch (type) {\n        case STRING: {\n          return value.substring(1, value.length() - 1);\n        }\n        case BOOLEAN: {\n          return value.equalsIgnoreCase(\"true\") ? Boolean.TRUE : Boolean.FALSE;\n        }\n        case INT: {\n          if (value.length() > 2 && value.charAt(0) == '0' &&\n              (value.charAt(1) == 'x' || value.charAt(1) == 'X')) {\n            // HEX value\n            return Long.valueOf(PreprocessorUtils.extractTail(\"0x\", value), 16);\n          } else {\n            // Decimal value\n            return Long.valueOf(value);\n          }\n        }\n        case FLOAT: {\n          return Float.valueOf(value);\n        }\n        default:\n          return null;\n      }\n    } catch (NumberFormatException e) {\n      return null;\n    }\n  }\n\n\n  public static ValueType recognizeType(final String value) {\n    if (value.equalsIgnoreCase(\"true\") || value.equalsIgnoreCase(\"false\")) // Boolean\n    {\n      return ValueType.BOOLEAN;\n    } else if (value.length() > 1 && value.charAt(0) == '\\\"' &&\n        value.charAt(value.length() - 1) == '\\\"') // String value\n    {\n      return ValueType.STRING;\n    } else {\n      try {\n        if (value.indexOf('.') >= 0) {\n          // Float\n          Float.parseFloat(value);\n          return ValueType.FLOAT;\n        } else {\n          // Integer\n          if (value.startsWith(\"0x\")) {\n            // HEX value\n            Long.parseLong(PreprocessorUtils.extractTail(\"0x\", value), 16);\n          } else {\n            // Decimal value\n            Long.parseLong(value, 10);\n          }\n          return ValueType.INT;\n        }\n      } catch (NumberFormatException e) {\n        return ValueType.UNKNOWN;\n      }\n    }\n  }\n\n\n  public ValueType getType() {\n    return type;\n  }\n\n\n  public Object getValue() {\n    return value;\n  }\n\n\n  public Long asLong() {\n    if (type != ValueType.INT) {\n      throw new IllegalStateException(\"Value is not integer\");\n    }\n    return (Long) value;\n  }\n\n\n  public Float asFloat() {\n    if (type != ValueType.FLOAT) {\n      throw new IllegalStateException(\"Value is not float\");\n    }\n    return (Float) value;\n  }\n\n\n  public String asString() {\n    if (type != ValueType.STRING) {\n      throw new IllegalStateException(\"Value is not string\");\n    }\n    return (String) value;\n  }\n\n\n  public Boolean asBoolean() {\n    if (type != ValueType.BOOLEAN) {\n      throw new IllegalStateException(\"Value is not boolean\");\n    }\n    return (Boolean) value;\n  }\n\n\n  public String toStringDetail() {\n    switch (type) {\n      case BOOLEAN: {\n        return \"Boolean: \" + value;\n      }\n      case INT: {\n        return \"Integer: \" + value;\n      }\n      case UNKNOWN: {\n        return \"Unknown: -\";\n      }\n      case FLOAT: {\n        return \"Float: \" + value;\n      }\n      case STRING: {\n        return \"String: \" + value;\n      }\n    }\n    return \"Unexpected unsupported type, contact developer [\" + type + \"]\";\n  }\n\n  @Override\n  public String toString() {\n    switch (this.type) {\n      case BOOLEAN:\n        return this.asBoolean().toString();\n      case INT:\n        return this.asLong().toString();\n      case UNKNOWN:\n        return \"<UNKNOWN>\";\n      case FLOAT:\n        return this.asFloat().toString();\n      case STRING:\n        return asString();\n      default:\n        return \"Unexpected unsupported type, contact developer [\" + type + \"]\";\n    }\n  }\n\n  public boolean toBoolean() {\n    switch (this.type) {\n      case BOOLEAN:\n        return this.asBoolean();\n      case INT:\n        return this.asLong() != 0L;\n      case FLOAT:\n        return Math.round(this.asFloat()) != 0;\n      case STRING:\n        return \"true\".equalsIgnoreCase(this.asString().trim());\n      default:\n        return false;\n    }\n  }\n\n  @Override\n  public ExpressionItemType getExpressionItemType() {\n    return ExpressionItemType.VALUE;\n  }\n\n  @Override\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.VALUE;\n  }\n\n  @Override\n  public boolean equals(final Object var) {\n    if (this == var) {\n      return true;\n    }\n\n    if (var instanceof Value) {\n      final Value thatValue = (Value) var;\n\n      return this.type == thatValue.type && this.value.equals(thatValue.value);\n    }\n    return false;\n  }\n\n  @Override\n  public int hashCode() {\n    return this.value.hashCode();\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/ValueType.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\n/**\n * The enumeration contains all allowed types for expression values and their\n * signatures\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic enum ValueType {\n\n  ANY(\"Any\"), STRING(\"Str\"), BOOLEAN(\"Bool\"), INT(\"Int\"), FLOAT(\"Float\"), UNKNOWN(\"Unknown\");\n\n  /**\n   * The signature for the type it will be used in method calls\n   */\n  private final String signature;\n\n  ValueType(final String signature) {\n    this.signature = signature;\n  }\n\n\n  public String getSignature() {\n    return this.signature;\n  }\n\n  /**\n   * To check that the type is compatible with another one\n   *\n   * @param type the type to be checked, must not be null\n   * @return true if the type is compatible else false\n   */\n  public boolean isCompatible(final ValueType type) {\n    if (this == type) {\n      return true;\n    }\n\n    return this != UNKNOWN && type != UNKNOWN && (this == ANY || type == ANY);\n\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/Variable.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\nimport java.util.Objects;\n\n/**\n * The class describes an expression variable\n *\n * @author Igor Mznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class Variable implements ExpressionItem {\n\n  /**\n   * The variable contains the expression variable name\n   */\n  private final String variableName;\n\n  /**\n   * The constructor\n   *\n   * @param varName the variable name, it must not be null\n   */\n  public Variable(final String varName) {\n    Objects.requireNonNull(varName, \"Var name is null\");\n    this.variableName = varName;\n  }\n\n  /**\n   * Get the variable name\n   *\n   * @return the name saved by the object\n   */\n\n  public String getName() {\n    return this.variableName;\n  }\n\n  /**\n   * Get the expression item type\n   *\n   * @return it returns only ExpressionItemType.VARIABLE\n   */\n  @Override\n\n  public ExpressionItemType getExpressionItemType() {\n    return ExpressionItemType.VARIABLE;\n  }\n\n  /**\n   * Get the expression item priority\n   *\n   * @return it returns only ExpressionItemPriority.VALUE\n   */\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.VALUE;\n  }\n\n  @Override\n\n  public String toString() {\n    return this.variableName;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/AbstractFunction.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static com.igormaznitsa.jcp.expression.ExpressionTreeElement.ANY_ARITY;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItem;\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.ExpressionItemType;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_ATTR;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_GET;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_LIST;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_NAME;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_OPEN;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_ROOT;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_SIZE;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_TEXT;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_XELEMENT;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_XLIST;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.atomic.AtomicLong;\nimport java.util.concurrent.atomic.AtomicReference;\nimport java.util.stream.Collectors;\n\n/**\n * The abstract class is the base for each function handler in the preprocessor\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic abstract class AbstractFunction implements ExpressionItem {\n\n  public static final Set<Integer> ARITY_ANY = Set.of(ANY_ARITY);\n  public static final Set<Integer> ARITY_0 = Set.of(0);\n  public static final Set<Integer> ARITY_1 = Set.of(1);\n  public static final Set<Integer> ARITY_1_2 = Set.of(1, 2);\n  public static final Set<Integer> ARITY_2 = Set.of(2);\n  public static final Set<Integer> ARITY_3 = Set.of(3);\n\n  /**\n   * The string contains the prefix for all executing methods of functions\n   */\n  public static final String EXECUTION_PREFIX = \"execute\";\n\n  /**\n   * Internal counter to generate UID for some cases\n   */\n  protected static final AtomicLong UID_COUNTER = new AtomicLong(1);\n\n  /**\n   * Current internal map contains all preprocessor functions, mapped by their names\n   */\n  private static final AtomicReference<Map<String, AbstractFunction>> allFunctions =\n      new AtomicReference<>();\n\n  @SuppressWarnings(\"StaticInitializerReferencesSubClass\")\n  private static final List<AbstractFunction> DEFAULT_INTERNAL_FUNCTIONS = List.of(\n      new FunctionABS(),\n      new FunctionROUND(),\n      new FunctionESC(),\n      new FunctionSTR2INT(),\n      new FunctionSTR2WEB(),\n      new FunctionSTR2CSV(),\n      new FunctionSTR2JS(),\n      new FunctionSTR2JSON(),\n      new FunctionSTR2XML(),\n      new FunctionSTR2JAVA(),\n      new FunctionSTR2GO(),\n      new FunctionTRIMLINES(),\n      new FunctionSTRLEN(),\n      new FunctionISSUBSTR(),\n      new FunctionIS(),\n      new FunctionEVALFILE(),\n      new FunctionBINFILE(),\n      new FunctionXML_GET(),\n      new FunctionXML_SIZE(),\n      new FunctionXML_ATTR(),\n      new FunctionXML_ROOT(),\n      new FunctionXML_NAME(),\n      new FunctionXML_LIST(),\n      new FunctionXML_TEXT(),\n      new FunctionXML_OPEN(),\n      new FunctionXML_XLIST(),\n      new FunctionXML_XELEMENT()\n  );\n  private static final Map<String, AbstractFunction> DEFAULT_INTERNAL_FUNCTIONS_MAP =\n      DEFAULT_INTERNAL_FUNCTIONS.stream()\n          .collect(Collectors.toMap(AbstractFunction::getName, x -> x));\n\n  public static List<AbstractFunction> findAllFunctions() {\n    Map<String, AbstractFunction> currentAllFunctions = allFunctions.get();\n    if (currentAllFunctions == null) {\n      return DEFAULT_INTERNAL_FUNCTIONS;\n    } else {\n      return currentAllFunctions.values().stream()\n          .sorted(Comparator.comparing(AbstractFunction::getName))\n          .collect(Collectors.toList());\n    }\n  }\n\n  public static Map<String, AbstractFunction> getFunctionNameMap() {\n    final Map<String, AbstractFunction> result = allFunctions.get();\n    if (result == null) {\n      return DEFAULT_INTERNAL_FUNCTIONS_MAP;\n    }\n    return result;\n  }\n\n  /**\n   * Allows to find a function handler instance for its class\n   *\n   * @param <E>           the class of the needed function handler extends the\n   *                      AbstractFunction class\n   * @param functionClass the class of the needed handler, must not be null\n   * @return an instance of the needed handler or null if there is not any such\n   * one\n   */\n  public static <E extends AbstractFunction> E findForClass(final Class<E> functionClass) {\n    E result = null;\n    for (final AbstractFunction function : findAllFunctions()) {\n      if (function.getClass() == functionClass) {\n        result = functionClass.cast(function);\n        break;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Find a function handler for its name\n   *\n   * @param functionName the function name, must not be null\n   * @return an instance of the needed handler or null if there is not any such\n   * one\n   */\n  public static AbstractFunction findForName(final String functionName) {\n    return getFunctionNameMap().get(functionName);\n  }\n\n  /**\n   * Get the function name\n   *\n   * @return the function name in lower case, must not be null\n   */\n  public abstract String getName();\n\n  /**\n   * Get the function reference to be output for a help request\n   *\n   * @return the function information as a String, must not be null\n   */\n  public abstract String getReference();\n\n  /**\n   * Get the function arities\n   *\n   * @return all allowed arities for the function\n   * @since 7.3.0\n   */\n  public abstract Set<Integer> getArity();\n\n  /**\n   * Get arrays of supported argument types\n   *\n   * @return list of argument type combinations allowed by the function\n   * handler, must not be null\n   */\n  public abstract List<List<ValueType>> getAllowedArgumentTypes();\n\n  /**\n   * Get the result type\n   *\n   * @return the result type of the function, must not be null\n   */\n  public abstract ValueType getResultType();\n\n  /**\n   * Get the priority of the function in the expression tree\n   *\n   * @return the expression item priority for the function, must not be null\n   */\n  @Override\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.FUNCTION;\n  }\n\n  /**\n   * Get the expression item type\n   *\n   * @return the expression item type, in the case it is always\n   * ExpressionItemType.FUNCTION\n   */\n  @Override\n  public ExpressionItemType getExpressionItemType() {\n    return ExpressionItemType.FUNCTION;\n  }\n\n  @Override\n  public String toString() {\n    return \"FUNCTION: \" + getName();\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/AbstractStrConverter.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class is parent for converting classes.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic abstract class AbstractStrConverter extends AbstractFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES = List.of(List.of(ValueType.STRING));\n\n\n  public abstract Value executeStr(final PreprocessorContext context, final Value stringToConvert);\n\n  @Override\n  public final Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public final List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionABS.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements the abs function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionABS extends AbstractFunction {\n\n  private static final List<List<ValueType>> ARGUMENT_TYPES =\n      List.of(List.of(ValueType.INT), List.of(ValueType.FLOAT));\n\n  @Override\n  public String getName() {\n    return \"abs\";\n  }\n\n  public Value executeInt(final PreprocessorContext context, final Value value) {\n    return Value.valueOf(Math.abs(value.asLong()));\n  }\n\n  public Value executeFloat(final PreprocessorContext context, final Value value) {\n    return Value.valueOf(Math.abs(value.asFloat()));\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARGUMENT_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"returns the absolute value of the given number\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.ANY;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionBINFILE.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.StandardCharsets;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Set;\nimport java.util.zip.Deflater;\nimport org.apache.commons.codec.binary.Base64;\nimport org.apache.commons.io.FileUtils;\n\n/**\n * The Function loads bin file and encodes it into string.\n *\n * @author Igor Maznitsa (http://www.igormaznitsa.com)\n * @since 6.1.0\n */\npublic class FunctionBINFILE extends AbstractFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES =\n      List.of(List.of(ValueType.STRING, ValueType.STRING));\n\n  private static boolean hasSplitFlag(final String name, final Type type) {\n    final String opts = name.substring(type.name.length());\n    return opts.contains(\"S\") || opts.contains(\"s\");\n  }\n\n  private static boolean hasDeflateFlag(final String name, final Type type) {\n    final String opts = name.substring(type.name.length());\n    return opts.contains(\"D\") || opts.contains(\"d\");\n  }\n\n\n  private static String convertTo(final File file, final Type type, final boolean deflate,\n                                  final int lineLength, final String endOfLine) throws IOException {\n    final StringBuilder result = new StringBuilder(512);\n    byte[] array = FileUtils.readFileToByteArray(file);\n\n    if (deflate) {\n      array = deflate(array);\n    }\n\n    boolean addNextLine = false;\n\n    int visibleLineCharsCounter = 0;\n\n    switch (type) {\n      case BASE64: {\n        final String baseEncoded =\n            new Base64(lineLength, endOfLine.getBytes(StandardCharsets.UTF_8), false)\n                .encodeAsString(array);\n        result.append(baseEncoded.trim());\n      }\n      break;\n      case BYTEARRAY:\n      case INT8:\n      case UINT8: {\n        for (final byte b : array) {\n          if (result.length() > 0) {\n            result.append(',');\n            visibleLineCharsCounter++;\n          }\n\n          if (addNextLine) {\n            addNextLine = false;\n            visibleLineCharsCounter = 0;\n            result.append(endOfLine);\n          }\n\n          final int initialBufferLength = result.length();\n          switch (type) {\n            case BYTEARRAY: {\n              result.append(\"(byte)0x\")\n                  .append(Integer.toHexString(b & 0xFF).toUpperCase(Locale.ROOT));\n            }\n            break;\n            case UINT8: {\n              result.append(Integer.toString(b & 0xFF).toUpperCase(Locale.ROOT));\n            }\n            break;\n            case INT8: {\n              result.append(Integer.toString(b).toUpperCase(Locale.ROOT));\n            }\n            break;\n            default:\n              throw new Error(\"Unexpected type : \" + type);\n          }\n          visibleLineCharsCounter += result.length() - initialBufferLength;\n\n          if (lineLength > 0 && visibleLineCharsCounter >= lineLength) {\n            addNextLine = true;\n          }\n        }\n      }\n      break;\n      default:\n        throw new Error(\"Unexpected type : \" + type);\n    }\n\n    return result.toString();\n  }\n\n\n  private static byte[] deflate(final byte[] data) throws IOException {\n    final Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION);\n    deflater.setInput(data);\n\n    final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);\n\n    deflater.finish();\n    final byte[] buffer = new byte[1024];\n    while (!deflater.finished()) {\n      final int count = deflater.deflate(buffer);\n      outputStream.write(buffer, 0, count);\n    }\n    outputStream.close();\n    final byte[] output = outputStream.toByteArray();\n\n    deflater.end();\n\n    return output;\n  }\n\n  @Override\n  public String getName() {\n    return \"binfile\";\n  }\n\n  @Override\n  public String getReference() {\n    final StringBuilder buffer = new StringBuilder();\n    for (final Type t : Type.values()) {\n      if (buffer.length() > 0) {\n        buffer.append('|');\n      }\n      buffer.append(t.name);\n    }\n    buffer.append(\"[s|d|sd|ds]\");\n    return \"encode binary file as string, allowed types [\" + buffer +\n        \"], s - split lines, d - deflate compression\";\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_2;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n\n\n  public Value executeStrStr(final PreprocessorContext context, final Value strFilePath,\n                             final Value encodeType) {\n    final String filePath = strFilePath.asString();\n    final String encodeTypeAsString = encodeType.asString();\n    final Type type = Type.find(encodeTypeAsString);\n\n    if (type == null) {\n      throw context.makeException(\"Unsupported encode type [\" + encodeType.asString() + ']', null);\n    }\n\n    final int lengthOfLine = hasSplitFlag(encodeTypeAsString, type) ? 80 : -1;\n    final boolean doDeflate = hasDeflateFlag(encodeTypeAsString, type);\n\n    final File theFile = context.findFileInSources(filePath);\n\n    if (context.isVerbose()) {\n      context.logForVerbose(\"Loading content of bin file '\" + theFile + '\\'');\n    }\n\n    try {\n      final String endOfLine = System.getProperty(\"line.separator\", \"\\r\\n\");\n      PreprocessorUtils.findActiveFileInfoContainer(context)\n          .ifPresent(t ->\n              t.getIncludedSources().add(theFile));\n      return Value.valueOf(convertTo(theFile, type, doDeflate, lengthOfLine, endOfLine));\n    } catch (Exception ex) {\n      throw context.makeException(\"Unexpected exception\", ex);\n    }\n  }\n\n  private enum Type {\n    BASE64(\"base64\"),\n    BYTEARRAY(\"byte[]\"),\n    UINT8(\"uint8[]\"),\n    INT8(\"int8[]\");\n\n    private final String name;\n\n    Type(final String name) {\n      this.name = name;\n    }\n\n\n    public static Type find(final String name) {\n      Type result = null;\n      if (name != null) {\n        final String normalized = name.toLowerCase(Locale.ROOT).trim();\n        for (final Type t : values()) {\n          if (normalized.startsWith(t.name)) {\n            result = t;\n            break;\n          }\n        }\n      }\n      return result;\n    }\n\n\n    public String getName() {\n      return this.name;\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionDefinedByUser.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static com.igormaznitsa.jcp.expression.ExpressionTreeElement.ANY_ARITY;\nimport static java.util.Objects.requireNonNull;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport java.util.stream.IntStream;\n\n/**\n * The class implements the user defined function handler (a function which name\n * starts with $)\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionDefinedByUser extends AbstractFunction {\n\n  private static final List<ValueType> ARGS_0 = List.of();\n  private static final List<ValueType> ARGS_1 = List.of(ValueType.ANY);\n  private static final List<ValueType> ARGS_2 = List.of(ValueType.ANY, ValueType.ANY);\n  private static final List<ValueType> ARGS_3 =\n      List.of(ValueType.ANY, ValueType.ANY, ValueType.ANY);\n  private static final List<ValueType> ARGS_4 =\n      List.of(ValueType.ANY, ValueType.ANY, ValueType.ANY, ValueType.ANY);\n  private static final List<ValueType> ARGS_5 =\n      List.of(ValueType.ANY, ValueType.ANY, ValueType.ANY, ValueType.ANY, ValueType.ANY);\n\n  private final String name;\n  private final Set<Integer> allowedArities;\n  private final List<List<ValueType>> argVariants;\n\n  public FunctionDefinedByUser(final String name, final Set<Integer> allowedArities,\n                               final PreprocessorContext context) {\n    super();\n    requireNonNull(name, \"Name is null\");\n    requireNonNull(context, \"Context is null\");\n\n    this.name = name;\n    this.allowedArities = Set.copyOf(allowedArities);\n    if (this.allowedArities.contains(ANY_ARITY)) {\n      this.argVariants = List.of();\n    } else {\n      this.argVariants = new ArrayList<>();\n      for (final int arity : this.allowedArities) {\n        final List<ValueType> record;\n        switch (arity) {\n          case 0:\n            record = ARGS_0;\n            break;\n          case 1:\n            record = ARGS_1;\n            break;\n          case 2:\n            record = ARGS_2;\n            break;\n          case 3:\n            record = ARGS_3;\n            break;\n          case 4:\n            record = ARGS_4;\n            break;\n          case 5:\n            record = ARGS_5;\n            break;\n          default: {\n            record = IntStream.of(arity).mapToObj(x -> ValueType.ANY).collect(Collectors.toList());\n          }\n          break;\n        }\n        this.argVariants.add(record);\n      }\n    }\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return this.allowedArities;\n  }\n\n\n  public Value execute(final PreprocessorContext context, final List<Value> values) {\n    final List<PreprocessorExtension> extensionList = context.getPreprocessorExtensions();\n    if (extensionList.isEmpty()) {\n      throw context\n          .makeException(\n              \"Found user defined function, but there is not any preprocessor extension to process it\",\n              null);\n    }\n\n    final Set<Integer> expectedArity = Set.of(values.size());\n\n    final PreprocessorExtension extension =\n        extensionList.stream().filter(x -> x.hasUserFunction(this.name, expectedArity))\n            .findFirst().orElseThrow(() -> context\n                .makeException(\n                    \"Can't find any preprocessor extension to process function \" + this.name + \" for \" +\n                        values.size() + \" argument(s)\", null));\n    context.logDebug(\"Processing \" + this.name + '/' + values.size() + \" by \" +\n        extension.getClass().getCanonicalName());\n    return extension.processUserFunction(context, name, values);\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return this.argVariants;\n  }\n\n  @Override\n  public String getReference() {\n    return \"user defined function\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.ANY;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionESC.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Set;\n\n/**\n * The class implements escape function handler to escape strings to be used inside preprocessor string value definitions.\n */\npublic final class FunctionESC extends AbstractFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES = List.of(List.of(ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"esc\";\n  }\n\n  public Value executeStr(final PreprocessorContext context, final Value source) {\n    final String sourceString = source.asString();\n    final StringBuilder result = new StringBuilder();\n    for (int i = 0; i < sourceString.length(); i++) {\n      final char chr = sourceString.charAt(i);\n      switch (chr) {\n        case '\\n':\n          result.append(\"\\\\n\");\n          break;\n        case '\\t':\n          result.append(\"\\\\t\");\n          break;\n        case '\\b':\n          result.append(\"\\\\b\");\n          break;\n        case '\\f':\n          result.append(\"\\\\f\");\n          break;\n        case '\\r':\n          result.append(\"\\\\r\");\n          break;\n        case '\\\\':\n          result.append(\"\\\\\\\\\");\n          break;\n        case '\\'':\n          result.append(\"\\\\'\");\n          break;\n        case '\\\"':\n          result.append(\"\\\\\\\"\");\n          break;\n        default: {\n          if (chr > 0x7F || Character.isISOControl(chr)) {\n            String hexCode = Integer.toHexString(chr).toUpperCase(Locale.ROOT);\n            if (hexCode.length() < 4) {\n              hexCode = \"0000\".substring(0, 4 - hexCode.length()) + hexCode;\n            }\n            result.append(\"\\\\u\").append(hexCode);\n          } else {\n            result.append(chr);\n          }\n        }\n      }\n    }\n    return Value.valueOf(result.toString());\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"escape string chars\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionEVALFILE.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static com.igormaznitsa.jcp.utils.IOUtils.closeQuietly;\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.findActiveFileInfoContainer;\n\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.io.File;\nimport java.io.StringWriter;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The Function makes preprocessing of a file and return result as a string value. It uses the current preprocessor context as the context for preprocessing the file.\n *\n * @author Igor Maznitsa (<a href=\"https://www.igormaznitsa.com\">...</a>)\n */\npublic class FunctionEVALFILE extends AbstractFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES = List.of(List.of(ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"evalfile\";\n  }\n\n  @Override\n  public String getReference() {\n    return \"preprocess file and return result as string\";\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n\n  private PreprocessorContext prepareContext(final PreprocessorContext base) {\n    final PreprocessorContext result = new PreprocessorContext(base);\n    result.setDryRun(true);\n    result.setKeepLines(false);\n    result.setClearTarget(false);\n    result.setKeepComments(CommentRemoverType.REMOVE_C_STYLE);\n    result.setCareForLastEol(true);\n    return result;\n  }\n\n  public Value executeStr(final PreprocessorContext context, final Value strFilePath) {\n    final String filePath = strFilePath.asString();\n    final File fileToEvaluate = context.findFileInSources(filePath);\n\n    if (context.isVerbose()) {\n      context.logForVerbose(\"Eval file '\" + fileToEvaluate + '\\'');\n    }\n\n    try {\n      final FileInfoContainer fileContainer =\n          new FileInfoContainer(fileToEvaluate, fileToEvaluate.getName(), false);\n\n      final PreprocessorContext evalContext = this.prepareContext(context);\n      final PreprocessingState state =\n          fileContainer.preprocessFileWithNotification(evalContext, null, false);\n\n      findActiveFileInfoContainer(context)\n          .ifPresent(f -> {\n            f.getIncludedSources().add(fileToEvaluate);\n            f.getIncludedSources().addAll(evalContext.findAllInputFiles());\n            f.getGeneratedResources().addAll(evalContext.findAllProducedFiles());\n          });\n\n      final StringWriter strWriter = new StringWriter(1024);\n      state.writePrinterBuffers(strWriter);\n      closeQuietly(strWriter);\n      return Value.valueOf(strWriter.toString());\n    } catch (Exception ex) {\n      throw context.makeException(\"Unexpected exception\", ex);\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionIS.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements the IS function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionIS extends AbstractFunction {\n\n  private static final List<List<ValueType>> SIGNATURES =\n      List.of(List.of(ValueType.STRING, ValueType.ANY));\n\n  @Override\n  public String getName() {\n    return \"is\";\n  }\n\n  // called through reflection!\n  public Value executeStrAny(\n      final PreprocessorContext context,\n      final Value varName,\n      final Value value) {\n    final Value currentValue = context.findVariableForName(varName.asString(), false);\n\n    Value result = Value.BOOLEAN_FALSE;\n\n    if (currentValue != null) {\n      result = value.toString().compareTo(currentValue.toString()) == 0 ? Value.BOOLEAN_TRUE :\n          Value.BOOLEAN_FALSE;\n    }\n\n    return result;\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_2;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return SIGNATURES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"check that string is string form of value\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.BOOLEAN;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionISSUBSTR.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements the ISSUBSTR function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionISSUBSTR extends AbstractFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES =\n      List.of(List.of(ValueType.STRING, ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"issubstr\";\n  }\n\n  public Value executeStrStr(final PreprocessorContext context, final Value subStrValue,\n                             final Value strValue) {\n    final String str = strValue.asString().toLowerCase();\n    final String subStr = subStrValue.asString().toLowerCase();\n    return Value.valueOf(str.contains(subStr));\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_2;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"check that string contains substring (case insensitive)\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.BOOLEAN;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionROUND.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements the round function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionROUND extends AbstractFunction {\n\n  private static final List<List<ValueType>> SIGNATURES =\n      List.of(List.of(ValueType.FLOAT), List.of(ValueType.INT));\n\n  @Override\n  public String getName() {\n    return \"round\";\n  }\n\n  public Value executeInt(final PreprocessorContext context, final Value value) {\n    return value;\n  }\n\n  public Value executeFloat(final PreprocessorContext context, final Value value) {\n    return Value.valueOf(Long.valueOf(Math.round(value.asFloat())));\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return SIGNATURES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"round float value to nearest integer\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.INT;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2CSV.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.apache.commons.text.StringEscapeUtils.escapeCsv;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\n\n/**\n * The class implements the str2csv function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionSTR2CSV extends AbstractStrConverter {\n\n  @Override\n  public String getName() {\n    return \"str2csv\";\n  }\n\n  @Override\n  public Value executeStr(final PreprocessorContext context, final Value value) {\n    final String escaped = escapeCsv(value.asString());\n    return Value.valueOf(escaped);\n  }\n\n  @Override\n  public String getReference() {\n    return \"escape string for CSV\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2GO.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements escape function handler to escape strings to be used in Go.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionSTR2GO extends AbstractFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES =\n      List.of(List.of(ValueType.STRING, ValueType.BOOLEAN));\n\n  private static String toUnicode(final char c) {\n    final StringBuilder result = new StringBuilder(4);\n    final String hex = Integer.toHexString(c);\n\n    result.append(\"0\".repeat(4 - hex.length()));\n    result.append(hex);\n\n    return result.toString();\n  }\n\n  private static String escapeGo(final String value) {\n    final StringBuilder result = new StringBuilder();\n\n    for (final char c : value.toCharArray()) {\n      switch (c) {\n        case '\\u0007':\n          result.append(\"\\\\a\");\n          break;\n        case '\\u000b':\n          result.append(\"\\\\v\");\n          break;\n        case '\\b':\n          result.append(\"\\\\b\");\n          break;\n        case '\\f':\n          result.append(\"\\\\f\");\n          break;\n        case '\\n':\n          result.append(\"\\\\n\");\n          break;\n        case '\\r':\n          result.append(\"\\\\r\");\n          break;\n        case '\\t':\n          result.append(\"\\\\t\");\n          break;\n        case '\\\\':\n          result.append(\"\\\\\\\\\");\n          break;\n        case '\\'':\n          result.append(\"\\\\'\");\n          break;\n        case '\\\"':\n          result.append(\"\\\\\\\"\");\n          break;\n        case ' ':\n          result.append(\" \");\n          break;\n        default: {\n          if (Character.isISOControl(c) || Character.isWhitespace(c) || c > 0xFF) {\n            result.append(\"\\\\u\").append(toUnicode(c));\n          } else {\n            result.append(c);\n          }\n        }\n        break;\n      }\n    }\n\n    return result.toString();\n  }\n\n  @Override\n  public String getName() {\n    return \"str2go\";\n  }\n\n  // called through reflection\n  public Value executeStrBool(final PreprocessorContext context, final Value source,\n                              final Value splitAndQuoteLines) {\n    if (splitAndQuoteLines.asBoolean()) {\n      final boolean endsWithNextLine = source.asString().endsWith(\"\\n\");\n      final List<String> split =\n          PreprocessorUtils.splitForCharAndHoldEmptyLine(source.asString(), '\\n');\n      final StringBuilder result = new StringBuilder(source.asString().length() * 2);\n      final String nextLineChars = PreprocessorUtils.getNextLineCodes();\n\n      int index = 0;\n      for (final String s : split) {\n        final boolean last = ++index == split.size();\n        if (result.length() > 0) {\n          result.append(nextLineChars).append('+');\n        }\n        result.append('\\\"').append(escapeGo(s));\n        if (last) {\n          result.append(endsWithNextLine ? \"\\\\n\\\"\" : \"\\\"\");\n        } else {\n          result.append(\"\\\\n\\\"\");\n        }\n      }\n      return Value.valueOf(result.toString());\n    } else {\n      return Value.valueOf(escapeGo(source.asString()));\n    }\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_2;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"escape string for GoLang\";\n  }\n\n  @Override\n\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2INT.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\n\n/**\n * The class implements the str2int function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionSTR2INT extends AbstractStrConverter {\n\n  @Override\n  public String getName() {\n    return \"str2int\";\n  }\n\n  @Override\n  public Value executeStr(final PreprocessorContext context, final Value value) {\n    return Value.valueOf(Long.parseLong(value.asString().trim()));\n  }\n\n  @Override\n  public String getReference() {\n    return \"string to integer\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.INT;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2JAVA.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.apache.commons.text.StringEscapeUtils.escapeJava;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements escape function handler to escape strings to be used in java.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionSTR2JAVA extends AbstractFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES =\n      List.of(List.of(ValueType.STRING, ValueType.BOOLEAN));\n\n  @Override\n  public String getName() {\n    return \"str2java\";\n  }\n\n  public Value executeStrBool(final PreprocessorContext context, final Value source,\n                              final Value splitAndQuoteLines) {\n    if (splitAndQuoteLines.asBoolean()) {\n      final boolean endsWithNextLine = source.asString().endsWith(\"\\n\");\n      final List<String> split =\n          PreprocessorUtils.splitForCharAndHoldEmptyLine(source.asString(), '\\n');\n      final StringBuilder result = new StringBuilder(source.asString().length() * 2);\n      final String nextLineChars = PreprocessorUtils.getNextLineCodes();\n\n      int index = 0;\n      for (final String s : split) {\n        final boolean last = ++index == split.size();\n        if (result.length() > 0) {\n          result.append(nextLineChars).append('+');\n        }\n        result.append('\\\"').append(escapeJava(s));\n        if (last) {\n          result.append(endsWithNextLine ? \"\\\\n\\\"\" : \"\\\"\");\n        } else {\n          result.append(\"\\\\n\\\"\");\n        }\n      }\n      return Value.valueOf(result.toString());\n    } else {\n      return Value.valueOf(escapeJava(source.asString()));\n    }\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_2;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"escape string for Java\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2JS.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.apache.commons.text.StringEscapeUtils.escapeEcmaScript;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\n\n/**\n * The class implements the str2js function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionSTR2JS extends AbstractStrConverter {\n\n  @Override\n  public String getName() {\n    return \"str2js\";\n  }\n\n  @Override\n  public Value executeStr(final PreprocessorContext context, final Value value) {\n    final String escaped = escapeEcmaScript(value.asString());\n    return Value.valueOf(escaped);\n  }\n\n  @Override\n  public String getReference() {\n    return \"escape string for EcmaScript/JavaScript\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2JSON.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.apache.commons.text.StringEscapeUtils.escapeJson;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\n\n/**\n * The class implements the str2json function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionSTR2JSON extends AbstractStrConverter {\n\n  @Override\n  public String getName() {\n    return \"str2json\";\n  }\n\n  @Override\n  public Value executeStr(final PreprocessorContext context, final Value value) {\n    final String escaped = escapeJson(value.asString());\n    return Value.valueOf(escaped);\n  }\n\n  @Override\n  public String getReference() {\n    return \"escape string for JSON\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2WEB.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.apache.commons.text.StringEscapeUtils.escapeHtml3;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\n\n/**\n * The class implements the str2web function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionSTR2WEB extends AbstractStrConverter {\n\n  @Override\n  public String getName() {\n    return \"str2web\";\n  }\n\n  @Override\n  public Value executeStr(final PreprocessorContext context, final Value value) {\n    final String escaped = escapeHtml3(value.asString());\n\n    final StringBuilder result = new StringBuilder(escaped.length() * 2);\n    for (int i = 0; i < escaped.length(); i++) {\n      final char ch = escaped.charAt(i);\n      if (ch < 128) {\n        result.append(ch);\n      } else {\n        result.append(\"&#\").append(Character.codePointAt(escaped, i)).append(';');\n      }\n    }\n\n    return Value.valueOf(result.toString());\n  }\n\n  @Override\n  public String getReference() {\n    return \"escape string for HTML3\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2XML.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.apache.commons.text.StringEscapeUtils.escapeXml10;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\n\n/**\n * The class implements the str2xml function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionSTR2XML extends AbstractStrConverter {\n\n  @Override\n  public String getName() {\n    return \"str2xml\";\n  }\n\n  @Override\n  public Value executeStr(final PreprocessorContext context, final Value value) {\n    final String escaped = escapeXml10(value.asString());\n    return Value.valueOf(escaped);\n  }\n\n  @Override\n  public String getReference() {\n    return \"escape string for XML(1.0)\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionSTRLEN.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements the STRLEN function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionSTRLEN extends AbstractFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES = List.of(List.of(ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"strlen\";\n  }\n\n\n  public Value executeStr(final PreprocessorContext context, final Value value) {\n    return Value.valueOf(Long.valueOf(value.asString().length()));\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"get string length\";\n  }\n\n  @Override\n\n  public ValueType getResultType() {\n    return ValueType.INT;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/FunctionTRIMLINES.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\n\n/**\n * The class implements the TRIMLINES function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionTRIMLINES extends AbstractStrConverter {\n\n  @Override\n  public String getName() {\n    return \"trimlines\";\n  }\n\n  @Override\n  public Value executeStr(final PreprocessorContext context, final Value value) {\n    final String text = value.asString();\n    final StringBuilder result = new StringBuilder(text.length());\n\n    for (final String s : PreprocessorUtils.splitForChar(text, '\\n')) {\n      final String trimmed = s.trim();\n      if (!trimmed.isEmpty()) {\n        if (result.length() > 0) {\n          result.append(PreprocessorUtils.getNextLineCodes());\n        }\n        result.append(trimmed);\n      }\n    }\n\n    return Value.valueOf(result.toString());\n  }\n\n  @Override\n  public String getReference() {\n    return \"trim each line found in string, remove empty lines\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/AbstractXMLFunction.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.functions.AbstractFunction;\nimport javax.xml.xpath.XPath;\nimport javax.xml.xpath.XPathExpression;\nimport javax.xml.xpath.XPathExpressionException;\nimport javax.xml.xpath.XPathFactory;\nimport org.apache.xpath.jaxp.XPathFactoryImpl;\nimport org.w3c.dom.Document;\nimport org.w3c.dom.Element;\nimport org.w3c.dom.Node;\nimport org.w3c.dom.NodeList;\n\npublic abstract class AbstractXMLFunction extends AbstractFunction {\n\n\n  public static String makeElementListId(final Element parentName, final String elementName) {\n    return buildPathForElement(parentName) + \"_#list_\" + elementName;\n  }\n\n\n  public static String makeDocumentId(final String fileName) {\n    return \"xmlDocument_\" + fileName;\n  }\n\n\n  public static String makeDocumentRootId(final String documentId) {\n    return documentId + \"_#root\";\n  }\n\n\n  public static String makeElementId(final String elementListId, final int elementIndex) {\n    return elementListId + '_' + elementIndex;\n  }\n\n\n  public static String makeXPathListId(final String documentId, final String xpath) {\n    return documentId + \"_#xpath_\" + xpath;\n  }\n\n\n  public static String makeXPathElementId(final String documentId, final String xpath) {\n    return documentId + \"_#xpathelement_\" + xpath;\n  }\n\n\n  public static String buildPathForElement(final Element element) {\n    final StringBuilder result = new StringBuilder();\n\n    Node theNode = element;\n\n    while (theNode != null) {\n      int level = 0;\n      Node sibling = theNode;\n      while (sibling != null) {\n        level++;\n        sibling = sibling.getPreviousSibling();\n      }\n\n      result.append('/').append(theNode.getNodeName()).append('{').append(level).append('}');\n      theNode = theNode.getParentNode();\n    }\n\n    return result.toString();\n  }\n\n\n  public static String getFirstLevelTextContent(final Node node) {\n    final NodeList list = node.getChildNodes();\n    final StringBuilder textContent = new StringBuilder(128);\n    for (int i = 0; i < list.getLength(); ++i) {\n      final Node child = list.item(i);\n      if (child.getNodeType() == Node.TEXT_NODE) {\n        textContent.append(child.getTextContent());\n      }\n    }\n    return textContent.toString();\n  }\n\n\n  protected static XPathExpression prepareXPathExpression(final String path)\n      throws XPathExpressionException {\n    final XPathFactory factory = new XPathFactoryImpl();\n    final XPath xpath = factory.newXPath();\n    return xpath.compile(path);\n  }\n\n\n  public String getAttribute(final PreprocessorContext context, final String elementId,\n                             final String attributeName) {\n    final NodeContainer container = (NodeContainer) context.getSharedResource(elementId);\n    if (container == null) {\n      throw context\n          .makeException(\"Can't find any active element with the '\" + elementId + \"' id\", null);\n    }\n    try {\n      return ((Element) container.getNode()).getAttribute(attributeName);\n    } catch (ClassCastException ex) {\n      throw context.makeException(\n          \"Incompatible cached element type [\" + elementId + '.' + attributeName + ']', ex);\n    }\n  }\n\n\n  public Document getCachedDocument(final PreprocessorContext context, final String documentId) {\n    final NodeContainer container = (NodeContainer) context.getSharedResource(documentId);\n    if (container == null) {\n      throw context\n          .makeException(\"Can't find any document for the '\" + documentId + \"' id\", null);\n    }\n\n    try {\n      return (Document) container.getNode();\n    } catch (ClassCastException ex) {\n      throw context.makeException(\"Incompatible cached element type [\" + documentId + ']', ex);\n    }\n  }\n\n\n  public Element findCachedElement(final PreprocessorContext context, final String elementId) {\n    final NodeContainer container = (NodeContainer) context.getSharedResource(elementId);\n    if (container == null) {\n      return null;\n    }\n\n    try {\n      return (Element) container.getNode();\n    } catch (ClassCastException ex) {\n      throw context.makeException(\"Incompatible cached element type [\" + elementId + ']', null);\n    }\n  }\n\n\n  public Element getCachedElement(final PreprocessorContext context, final String elementId) {\n    final Element element = findCachedElement(context, elementId);\n    if (element == null) {\n      throw context\n          .makeException(\"Can't find any active element for the '\" + elementId + \"' id\", null);\n    }\n    return element;\n  }\n\n\n  public NodeList findCachedElementList(final PreprocessorContext context,\n                                        final String elementListId) {\n    final NodeContainer container = (NodeContainer) context.getSharedResource(elementListId);\n    if (container == null) {\n      return null;\n    }\n    try {\n      return container.getNodeList();\n    } catch (ClassCastException ex) {\n      throw context.makeException(\"Incompatible cached element type [\" + elementListId + ']', ex);\n    }\n  }\n\n\n  public NodeList getCachedElementList(final PreprocessorContext context,\n                                       final String elementListId) {\n    final NodeList result = findCachedElementList(context, elementListId);\n    if (result == null) {\n      throw context\n          .makeException(\"Can't find any active element list for the '\" + elementListId + \"' id\",\n              null);\n    }\n    return result;\n  }\n\n  public int getElementListSize(final PreprocessorContext context, final String elementListId) {\n    return getCachedElementList(context, elementListId).getLength();\n  }\n\n\n  public String findElementForIndex(final PreprocessorContext context, final String elementListId,\n                                    final int elementIndex) {\n    final String elementCacheId = makeElementId(elementListId, elementIndex);\n    NodeContainer container = (NodeContainer) context.getSharedResource(elementCacheId);\n    if (container == null) {\n      container = (NodeContainer) context.getSharedResource(elementListId);\n\n      if (container == null) {\n        throw context\n            .makeException(\"Can't find any active node list for the id '\" + elementListId + '\\'',\n                null);\n      }\n\n      final NodeList list = container.getNodeList();\n      if (elementIndex < 0 || elementIndex >= list.getLength()) {\n        throw context\n            .makeException(\"The Element Index is out of bounds [\" + elementIndex + ']', null);\n      }\n\n      final Element element = (Element) list.item(elementIndex);\n\n      if (element == null) {\n        throw context.makeException(\"Wrong index [\" + elementIndex + ']', null);\n      }\n\n      container = new NodeContainer(UID_COUNTER.getAndIncrement(), element);\n      context.setSharedResource(elementCacheId, container);\n    }\n    return elementCacheId;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_ATTR.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements the xml_attr function\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionXML_ATTR extends AbstractXMLFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES =\n      List.of(List.of(ValueType.STRING, ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"xml_attr\";\n  }\n\n\n  public Value executeStrStr(final PreprocessorContext context, final Value elementId,\n                             final Value attributeName) {\n    return Value.valueOf(getAttribute(context, elementId.asString(), attributeName.asString()));\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_2;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"get value of named element attribute, if not found then empty string\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_GET.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements the xml_get function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionXML_GET extends AbstractXMLFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES =\n      List.of(List.of(ValueType.STRING, ValueType.INT));\n\n  @Override\n  public String getName() {\n    return \"xml_get\";\n  }\n\n  public Value executeStrInt(final PreprocessorContext context, final Value elementListId,\n                             final Value elementIndex) {\n    return Value.valueOf(\n        findElementForIndex(context, elementListId.asString(), elementIndex.asLong().intValue()));\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_2;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"get positioned element from list by index (0 based)\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_LIST.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.w3c.dom.Element;\nimport org.w3c.dom.NodeList;\n\n/**\n * The class implements the xml_list function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionXML_LIST extends AbstractXMLFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES =\n      List.of(List.of(ValueType.STRING, ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"xml_list\";\n  }\n\n  public Value executeStrStr(final PreprocessorContext context, final Value elementId,\n                             final Value elementTag) {\n    final String tagName = elementTag.asString();\n    final Element element = getCachedElement(context, elementId.asString());\n    final String listId = makeElementListId(element, tagName);\n\n    NodeContainer container = (NodeContainer) context.getSharedResource(listId);\n    if (container == null) {\n      final NodeList list = element.getElementsByTagName(tagName);\n      container = new NodeContainer(UID_COUNTER.getAndIncrement(), list);\n      context.setSharedResource(listId, container);\n    }\n\n    return Value.valueOf(listId);\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_2;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"get list of elements by tag name\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_NAME.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.w3c.dom.Element;\n\n/**\n * The class implements the xml_name function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionXML_NAME extends AbstractXMLFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES = List.of(List.of(ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"xml_name\";\n  }\n\n  public Value executeStr(final PreprocessorContext context, final Value elementId) {\n    final Element cachedElement = getCachedElement(context, elementId.asString());\n    return Value.valueOf(cachedElement.getTagName());\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"get element name (tag)\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_OPEN.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.findActiveFileInfoContainer;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.Set;\nimport javax.xml.parsers.ParserConfigurationException;\nimport org.apache.xerces.jaxp.DocumentBuilderFactoryImpl;\nimport org.w3c.dom.Document;\nimport org.xml.sax.SAXException;\n\n/**\n * The class implements the xml_open function handler\n *\n * @author Igor Maznits (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionXML_OPEN extends AbstractXMLFunction {\n\n  public static final String RES_XML_DOC_PREFIX = \"xml_doc_\";\n  public static final String RES_XML_ELEMENT_PREFIX = \"xml_elem_\";\n\n  private static final List<List<ValueType>> ARG_TYPES = List.of(List.of(ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"xml_open\";\n  }\n\n\n  public Value executeStr(final PreprocessorContext context, final Value filePath) {\n    final String name = filePath.asString();\n\n    final String documentId = makeDocumentId(name);\n    final String documentIdRoot = makeDocumentRootId(documentId);\n\n    NodeContainer docContainer = (NodeContainer) context.getSharedResource(documentId);\n    if (docContainer == null) {\n      final File file = context.findFileInSources(name);\n      final Document document = openFileAndParse(context, file);\n\n      findActiveFileInfoContainer(context)\n          .ifPresent(t -> t.getIncludedSources().add(file));\n\n      docContainer = new NodeContainer(UID_COUNTER.getAndIncrement(), document);\n      context.setSharedResource(documentId, docContainer);\n      final NodeContainer rootContainer =\n          new NodeContainer(UID_COUNTER.getAndIncrement(), document.getDocumentElement());\n      context.setSharedResource(documentIdRoot, rootContainer);\n    }\n\n    return Value.valueOf(documentId);\n  }\n\n\n  private Document openFileAndParse(final PreprocessorContext context, final File file) {\n    final DocumentBuilderFactoryImpl docBuilderFactory = new DocumentBuilderFactoryImpl();\n    docBuilderFactory.setIgnoringComments(true);\n    docBuilderFactory.setCoalescing(true);\n    docBuilderFactory.setValidating(false);\n\n    try {\n      return docBuilderFactory.newDocumentBuilder().parse(file);\n    } catch (ParserConfigurationException unexpected) {\n      throw context.makeException(\"XML parser configuration exception\", unexpected);\n    } catch (SAXException unexpected) {\n      throw context.makeException(\"Exception during XML parsing\", unexpected);\n    } catch (IOException unexpected) {\n      throw context.makeException(\"Can't read XML file\", unexpected);\n    }\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"open and parse XML file\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_ROOT.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements the xml_getroot function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionXML_ROOT extends AbstractXMLFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES = List.of(List.of(ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"xml_root\";\n  }\n\n  public Value executeStr(final PreprocessorContext context, final Value documentId) {\n    final String documentRootId = makeDocumentRootId(documentId.asString());\n\n    final NodeContainer root = (NodeContainer) context.getSharedResource(documentRootId);\n    if (root == null) {\n      throw context.makeException(\"Can't find any root for document [\" + documentId + ']', null);\n    }\n    return Value.valueOf(documentRootId);\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"get root element of document\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_SIZE.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The class implements the xml_elementsnumber function\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionXML_SIZE extends AbstractXMLFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES = List.of(List.of(ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"xml_size\";\n  }\n\n  public Value executeStr(final PreprocessorContext context, final Value elementListId) {\n    return Value.valueOf(Long.valueOf(getElementListSize(context, elementListId.asString())));\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"element list size\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.INT;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_TEXT.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.w3c.dom.Element;\n\n/**\n * The class implements the xml_getelementtext function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionXML_TEXT extends AbstractXMLFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES = List.of(List.of(ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"xml_text\";\n  }\n\n  public Value executeStr(final PreprocessorContext context, final Value elementid) {\n    final Element element = getCachedElement(context, elementid.asString());\n    return Value.valueOf(element.getTextContent());\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_1;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"text of element (child element texts will be included)\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_XELEMENT.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport javax.xml.xpath.XPathConstants;\nimport javax.xml.xpath.XPathExpression;\nimport javax.xml.xpath.XPathExpressionException;\nimport org.w3c.dom.Document;\nimport org.w3c.dom.Element;\n\n/**\n * The class implements the xml_xpathelement function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionXML_XELEMENT extends AbstractXMLFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES =\n      List.of(List.of(ValueType.STRING, ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"xml_xelement\";\n  }\n\n  public Value executeStrStr(final PreprocessorContext context, final Value documentId,\n                             final Value xPath) {\n    final String documentIdStr = documentId.asString();\n    final String pathStr = xPath.asString();\n\n    final String xpathElementId = makeXPathElementId(documentIdStr, pathStr);\n    final Document document = getCachedDocument(context, documentIdStr);\n\n    Element elem = findCachedElement(context, xpathElementId);\n    if (elem == null) {\n      try {\n        final XPathExpression expression = prepareXPathExpression(pathStr);\n        elem = (Element) expression.evaluate(document, XPathConstants.NODE);\n        if (elem == null) {\n          throw context.makeException(\"Can't find element for xpath [\" + pathStr + ']', null);\n        }\n      } catch (XPathExpressionException ex) {\n        throw context.makeException(\"Error during XPath compilation [\" + pathStr + ']', ex);\n      } catch (ClassCastException ex) {\n        throw context.makeException(\"Can't get element for XPath [\" + pathStr + ']', ex);\n      }\n      final NodeContainer container = new NodeContainer(UID_COUNTER.getAndIncrement(), elem);\n      context.setSharedResource(xpathElementId, container);\n    }\n    return Value.valueOf(xpathElementId);\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_2;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"find single element with XPath, error if not found\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_XLIST.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport javax.xml.xpath.XPathConstants;\nimport javax.xml.xpath.XPathExpression;\nimport javax.xml.xpath.XPathExpressionException;\nimport org.w3c.dom.Document;\nimport org.w3c.dom.NodeList;\n\n/**\n * The class implements the xml_xpathlist function handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class FunctionXML_XLIST extends AbstractXMLFunction {\n\n  private static final List<List<ValueType>> ARG_TYPES =\n      List.of(List.of(ValueType.STRING, ValueType.STRING));\n\n  @Override\n  public String getName() {\n    return \"xml_xlist\";\n  }\n\n  public Value executeStrStr(final PreprocessorContext context, final Value documentId,\n                             final Value xPath) {\n    final String documentIdStr = documentId.asString();\n    final String pathStr = xPath.asString();\n\n    final String xpathId = makeXPathListId(documentIdStr, pathStr);\n    final Document document = getCachedDocument(context, documentIdStr);\n\n    NodeList list = findCachedElementList(context, xpathId);\n    if (list == null) {\n      try {\n        final XPathExpression expression = prepareXPathExpression(pathStr);\n        list = (NodeList) expression.evaluate(document, XPathConstants.NODESET);\n      } catch (XPathExpressionException ex) {\n        throw context.makeException(\"Error during XPath compilation [\" + pathStr + ']', ex);\n      }\n      final NodeContainer container = new NodeContainer(UID_COUNTER.getAndIncrement(), list);\n      context.setSharedResource(xpathId, container);\n    }\n    return Value.valueOf(xpathId);\n  }\n\n  @Override\n  public Set<Integer> getArity() {\n    return ARITY_2;\n  }\n\n  @Override\n  public List<List<ValueType>> getAllowedArgumentTypes() {\n    return ARG_TYPES;\n  }\n\n  @Override\n  public String getReference() {\n    return \"find element list with XPath\";\n  }\n\n  @Override\n  public ValueType getResultType() {\n    return ValueType.STRING;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/functions/xml/NodeContainer.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport java.util.Objects;\nimport org.w3c.dom.Node;\nimport org.w3c.dom.NodeList;\n\n/**\n * It's a special auxiliary class to save XML node data in a preprocessor\n * storage\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznnitsa.com)\n */\npublic class NodeContainer {\n\n  private final Node node;\n  private final NodeList nodeList;\n  private final long id;\n\n  public NodeContainer(final long id, final Node node) {\n    Objects.requireNonNull(node, \"Node is null\");\n    this.id = id;\n    this.node = node;\n    this.nodeList = null;\n  }\n\n  public NodeContainer(final long id, final NodeList list) {\n    Objects.requireNonNull(list, \"NodeList is null\");\n    this.id = id;\n    this.node = null;\n    this.nodeList = list;\n  }\n\n\n  public NodeList getNodeList() {\n    return this.nodeList;\n  }\n\n\n  public Node getNode() {\n    return this.node;\n  }\n\n  public long getId() {\n    return this.id;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/AbstractOperator.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItem;\nimport com.igormaznitsa.jcp.expression.ExpressionItemType;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicReference;\n\n/**\n * The class is the base for all operator handlers\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic abstract class AbstractOperator implements ExpressionItem {\n\n  /**\n   * The constant is the prefix for executing methods of operators\n   */\n  public static final String EXECUTION_PREFIX = \"execute\";\n\n  /**\n   * The list contains operators allowed by the preprocessor\n   */\n  private static final AtomicReference<List<AbstractOperator>> allOperators =\n      new AtomicReference<>();\n\n  @SuppressWarnings(\"StaticInitializerReferencesSubClass\")\n  private static final List<AbstractOperator> DEFAULT_OPERATORS = List.of(\n      new OperatorEQU(),\n      new OperatorGREAT(),\n      new OperatorGREATEQU(),\n      new OperatorLESS(),\n      new OperatorLESSEQU(),\n      new OperatorNOTEQU(),\n      new OperatorADD(),\n      new OperatorSUB(),\n      new OperatorMUL(),\n      new OperatorDIV(),\n      new OperatorMOD(),\n      new OperatorNOT(),\n      new OperatorAND(),\n      new OperatorOR(),\n      new OperatorXOR()\n  );\n\n  public static List<AbstractOperator> getAllOperators() {\n    final List<AbstractOperator> current = allOperators.get();\n    if (current == null) {\n      return DEFAULT_OPERATORS;\n    }\n    return current;\n  }\n\n  /**\n   * Find an operator handler for its class\n   *\n   * @param <E>           the handler class extends AbstractOperator\n   * @param operatorClass the class to be used for search, must not be null\n   * @return an instance of the handler or null if there is not any such one\n   */\n  public static <E extends AbstractOperator> E findForClass(final Class<E> operatorClass) {\n    for (final AbstractOperator operator : getAllOperators()) {\n      if (operator.getClass() == operatorClass) {\n        return operatorClass.cast(operator);\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Get the expression item type\n   *\n   * @return for operators it is always ExpressionItemType.OPERATOR\n   */\n  @Override\n  public ExpressionItemType getExpressionItemType() {\n    return ExpressionItemType.OPERATOR;\n  }\n\n  /**\n   * Get the operator arity\n   *\n   * @return the operator arity (1 or 2)\n   */\n  public abstract int getArity();\n\n  /**\n   * Get the operator keyword\n   *\n   * @return the operator keyword, must not be null\n   */\n  public abstract String getKeyword();\n\n  /**\n   * Get the operator reference to be shown for a help information request\n   *\n   * @return the operator reference as a String, must not be null\n   */\n  public abstract String getReference();\n\n  @Override\n  public String toString() {\n    return \"OPERATOR: \" + getKeyword();\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorADD.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the ADD operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorADD extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"additive operator (supports string concatenation)\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"+\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() + arg2.asLong());\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asFloat() + arg2.asFloat());\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong().floatValue() + arg2.asFloat());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asFloat() + arg2.asLong().floatValue());\n  }\n\n\n  public Value executeStrAny(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asString() + arg2.toString());\n  }\n\n\n  public Value executeAnyStr(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.toString() + arg2.asString());\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.ARITHMETIC_ADD_SUB;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorAND.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the AND operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorAND extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"conditional AND & bitwise AND\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"&&\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() & arg2.asLong());\n  }\n\n\n  public Value executeBoolBool(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asBoolean() && arg2.asBoolean());\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.LOGICAL;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorDIV.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the DIV operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorDIV extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"division\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"/\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() / arg2.asLong());\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() / arg2.asFloat());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asFloat() / arg2.asLong());\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asFloat() / arg2.asFloat());\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.ARITHMETIC_MUL_DIV_MOD;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorEQU.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the EQU operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorEQU extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"equal to\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"==\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() == arg2.asLong().longValue());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asLong().floatValue()) == 0);\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asLong().floatValue(), arg2.asFloat()) == 0);\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asFloat()) == 0);\n  }\n\n\n  public Value executeStrStr(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asString().equals(arg2.asString()));\n  }\n\n\n  public Value executeBoolBool(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asBoolean() == arg2.asBoolean().booleanValue());\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.COMPARISON;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorGREAT.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the GREAT operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorGREAT extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"greater than\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \">\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() > arg2.asLong());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asLong().floatValue()) > 0);\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asLong().floatValue(), arg2.asFloat()) > 0);\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asFloat()) > 0);\n  }\n\n\n  public Value executeStrStr(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asString().compareTo(arg2.asString()) > 0);\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.COMPARISON;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorGREATEQU.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the GREATEQU operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorGREATEQU extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"greater than or equal to\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \">=\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() >= arg2.asLong());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asLong().floatValue()) >= 0);\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asLong().floatValue(), arg2.asFloat()) >= 0);\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asFloat()) >= 0);\n  }\n\n\n  public Value executeStrStr(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asString().compareTo(arg2.asString()) >= 0);\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.COMPARISON;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorLESS.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the LESS operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorLESS extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"less than\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"<\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() < arg2.asLong());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asLong().floatValue()) < 0);\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asLong().floatValue(), arg2.asFloat()) < 0);\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asFloat()) < 0);\n  }\n\n\n  public Value executeStrStr(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asString().compareTo(arg2.asString()) < 0);\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.COMPARISON;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorLESSEQU.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the LESSEQU operator handler\n *\n * @author igorm\n */\npublic final class OperatorLESSEQU extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"less than or equal to\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"<=\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() <= arg2.asLong());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asLong().floatValue()) <= 0);\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asLong().floatValue(), arg2.asFloat()) <= 0);\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asFloat()) <= 0);\n  }\n\n\n  public Value executeStrStr(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asString().compareTo(arg2.asString()) <= 0);\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.COMPARISON;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorMOD.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the MOD operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorMOD extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"remainder\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"%\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() % arg2.asLong());\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong().floatValue() % arg2.asFloat());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asFloat() % arg2.asLong().floatValue());\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asFloat() % arg2.asFloat());\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.ARITHMETIC_MUL_DIV_MOD;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorMUL.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the MOD operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorMUL extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"multiplication\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"*\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() * arg2.asLong());\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong().floatValue() * arg2.asFloat());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asFloat() * arg2.asLong().floatValue());\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asFloat() * arg2.asFloat());\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.ARITHMETIC_MUL_DIV_MOD;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorNOT.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the NOT operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class OperatorNOT extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 1;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"logical & bitwise NOT\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"!\";\n  }\n\n\n  public Value executeInt(final Value arg1) {\n    return Value.valueOf(~arg1.asLong());\n  }\n\n\n  public Value executeBool(final Value arg1) {\n    return Value.valueOf(!arg1.asBoolean());\n  }\n\n\n  @Override\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.FUNCTION;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorNOTEQU.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the NOTEQU operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorNOTEQU extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"not equal to\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"!=\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() != arg2.asLong().longValue());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asLong().floatValue()) != 0);\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asLong().floatValue(), arg2.asFloat()) != 0);\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(Float.compare(arg1.asFloat(), arg2.asFloat()) != 0);\n  }\n\n\n  public Value executeStrStr(final Value arg1, final Value arg2) {\n    return Value.valueOf(!arg1.asString().equals(arg2.asString()));\n  }\n\n\n  public Value executeBoolBool(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asBoolean() != arg2.asBoolean().booleanValue());\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.COMPARISON;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorOR.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the OR operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorOR extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"conditional OR & bitwise OR\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"||\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() | arg2.asLong());\n  }\n\n\n  public Value executeBoolBool(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asBoolean() || arg2.asBoolean());\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.LOGICAL;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorSUB.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the SUB operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class OperatorSUB extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"subtraction\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"-\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() - arg2.asLong());\n  }\n\n\n  public Value executeIntFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong().floatValue() - arg2.asFloat());\n  }\n\n\n  public Value executeFloatInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asFloat() - arg2.asLong().floatValue());\n  }\n\n\n  public Value executeFloatFloat(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asFloat() - arg2.asFloat());\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.ARITHMETIC_ADD_SUB;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/expression/operators/OperatorXOR.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\n/**\n * The class implements the XOR operator handler\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class OperatorXOR extends AbstractOperator {\n\n  @Override\n  public int getArity() {\n    return 2;\n  }\n\n  @Override\n\n  public String getReference() {\n    return \"conditional XOR & bitwise XOR\";\n  }\n\n  @Override\n\n  public String getKeyword() {\n    return \"^\";\n  }\n\n\n  public Value executeIntInt(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asLong() ^ arg2.asLong());\n  }\n\n\n  public Value executeBoolBool(final Value arg1, final Value arg2) {\n    return Value.valueOf(arg1.asBoolean() ^ arg2.asBoolean());\n  }\n\n  @Override\n\n  public ExpressionItemPriority getExpressionItemPriority() {\n    return ExpressionItemPriority.LOGICAL;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/extension/LogPreprocessorExtension.java",
    "content": "package com.igormaznitsa.jcp.extension;\n\n\nimport com.igormaznitsa.jcp.containers.TextFileDataContainer;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\n\n/**\n * Preprocessor extension which just make info logging for arguments of action calls and also\n * can log user function calls, their arity should be provided in the end of function name like '$hello2(1,2)'\n * <b>It is for internal test purposes to log all calls of user defined functions.</b>\n *\n * @since 7.1.2\n */\npublic class LogPreprocessorExtension implements PreprocessorExtension {\n\n  private static final Pattern PATTERN = Pattern.compile(\"^(\\\\D+)(\\\\d+)?$\");\n\n  private static String findPosition(final PreprocessorContext context) {\n    if (context == null) {\n      return \"\";\n    }\n    if (context.getPreprocessingState().getIncludeStack().isEmpty()) {\n      return \"\";\n    } else {\n      final TextFileDataContainer dataContainer =\n          context.getPreprocessingState().getIncludeStack().get(0);\n      return (dataContainer.getFile() == null ? \"<unknown>\" : dataContainer.getFile().getName())\n          + ':'\n          + (dataContainer.getLastReadStringIndex() + 1);\n    }\n  }\n\n  @Override\n  public boolean hasAction(int arity) {\n    return true;\n  }\n\n  @Override\n  public boolean hasUserFunction(String name, Set<Integer> arity) {\n    return true;\n  }\n\n  @Override\n  public boolean processAction(final PreprocessorContext context, final List<Value> parameters) {\n    context.logInfo(String.format(\"Called action: %s at %s\", parameters.stream().map(\n            Value::toString).collect(Collectors.joining(\",\")),\n        findPosition(context)));\n    return true;\n  }\n\n  @Override\n  public Value processUserFunction(final PreprocessorContext context, final String functionName,\n                                   final List<Value> arguments) {\n    context.logInfo(\n        String.format(\"Called user function '%s'(%s) at %s\",\n            functionName, arguments,\n            findPosition(context)));\n    return Value.BOOLEAN_TRUE;\n  }\n\n  @Override\n  public Set<Integer> getUserFunctionArity(final String functionName) {\n    final Matcher matcher = PATTERN.matcher(functionName);\n    if (matcher.find() && matcher.group(2) != null) {\n      return Set.of(Integer.parseInt(matcher.group(2)));\n    }\n    return Set.of(0);\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/extension/PreprocessorExtension.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.extension;\n\nimport com.igormaznitsa.jcp.context.ExecutionAllowable;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.context.PreprocessorContextAware;\nimport com.igormaznitsa.jcp.expression.Value;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The interface describes an extension which can be connected to a preprocessor\n * and to be notified about some calls and actions\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic interface PreprocessorExtension extends PreprocessorContextAware, ExecutionAllowable {\n\n  @Override\n  default boolean isAllowed(PreprocessorContext context) {\n    return true;\n  }\n\n  /**\n   * Allows to check that the extension contains an action with required number of parameters.\n   *\n   * @param arity number of parameters for action, zero or great\n   * @return true if such action is provided by the extension\n   * @since 7.2.2\n   */\n  boolean hasAction(int arity);\n\n  /**\n   * Allows to check that the extension contains a user defined function with required number of parameters.\n   *\n   * @param name  name of the function to be checked, must not be null\n   * @param arity set of numbers of parameters for action, if empty set then check only name\n   * @return true if such user defined function is provided by the extension\n   * @since 7.3.0\n   */\n  boolean hasUserFunction(String name, Set<Integer> arity);\n\n  /**\n   * To process an action (it will be called if the preprocessor is met\n   * //#action directive)\n   *\n   * @param context    the current preprocessor context, must not be null\n   * @param parameters the parameters of the action directive, must not be null\n   * @return true if the action has been processed successfully or false, if it\n   * is false then exception will be thrown and preprocessing will be stopped\n   * @since 7.3.0\n   */\n  boolean processAction(PreprocessorContext context, List<Value> parameters);\n\n  /**\n   * Call to process a user function (such functions start with $)\n   *\n   * @param context      the current preprocessor context, must not be null\n   * @param functionName the name of the function (without $ and in low case),\n   *                     must not be null\n   * @param arguments    the function arguments, must not be null\n   * @return a calculated value, it must not be null\n   * @since 7.3.0\n   */\n  Value processUserFunction(PreprocessorContext context, String functionName,\n                            List<Value> arguments);\n\n  /**\n   * When a preprocessor meets a user defined function (the function starts with\n   * $) then it will ask for its arity\n   *\n   * @param functionName the function name without $ and in low case, must not\n   *                     be null\n   * @return the function arity (the argument number), zero or a great values\n   * @since 7.3.0\n   */\n  Set<Integer> getUserFunctionArity(String functionName);\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/gradle/JcpGradlePlugin.java",
    "content": "package com.igormaznitsa.jcp.gradle;\n\nimport org.gradle.api.Plugin;\nimport org.gradle.api.Project;\n\npublic class JcpGradlePlugin implements Plugin<Project> {\n\n  @Override\n  public void apply(final Project project) {\n    project.getTasks().create(JcpTask.ID, JcpTask.class);\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/gradle/JcpTask.java",
    "content": "package com.igormaznitsa.jcp.gradle;\n\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.fillContextByFoundServices;\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.findAndInstantiatePreprocessorExtensionForClassName;\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.findCommentRemoverForId;\nimport static java.util.Collections.emptyMap;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport org.apache.commons.io.FilenameUtils;\nimport org.gradle.api.DefaultTask;\nimport org.gradle.api.file.ConfigurableFileCollection;\nimport org.gradle.api.file.FileCollection;\nimport org.gradle.api.logging.Logger;\nimport org.gradle.api.model.ObjectFactory;\nimport org.gradle.api.provider.ListProperty;\nimport org.gradle.api.provider.MapProperty;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.tasks.Input;\nimport org.gradle.api.tasks.InputFiles;\nimport org.gradle.api.tasks.Internal;\nimport org.gradle.api.tasks.OutputFiles;\nimport org.gradle.api.tasks.TaskAction;\nimport org.gradle.api.tasks.TaskExecutionException;\nimport org.gradle.execution.commandline.TaskConfigurationException;\n\npublic class JcpTask extends DefaultTask {\n\n  public static final String ID = \"preprocess\";\n\n  /**\n   * Source root folders for preprocessing, if it is empty then project provided\n   * folders will be used.\n   */\n  private final ListProperty<File> sources;\n  /**\n   * End of line string to be used in reprocessed results. It supports java\n   * escaping chars.\n   */\n  private final Property<String> eol;\n  /**\n   * Keep attributes for preprocessing file and copy them to result one.\n   */\n  private final Property<Boolean> keepAttributes;\n  /**\n   * Target folder to place preprocessing result in regular source processing\n   * phase.\n   */\n  private final Property<File> target;\n  /**\n   * Encoding for text read operations.\n   */\n  private final Property<String> sourceEncoding;\n  /**\n   * Encoding for text write operations.\n   */\n  private final Property<String> targetEncoding;\n  /**\n   * Property contains preprocessor action extension class names or blank string if not provided.\n   * The class must have the default constructor.\n   *\n   * @see com.igormaznitsa.jcp.extension.PreprocessorExtension\n   * @since 7.2.2\n   */\n  private final ListProperty<String> actionPreprocessorExtensions;\n  /**\n   * Flag to ignore missing source folders, if false then mojo fail for any\n   * missing source folder, if true then missing folder will be ignored.\n   */\n  private final Property<Boolean> ignoreMissingSources;\n  /**\n   * List of file extensions to be excluded from preprocessing. By default\n   * excluded xml.\n   */\n  private final ListProperty<String> excludeExtensions;\n  /**\n   * List of file extensions to be included into preprocessing. By default\n   * java,txt,htm,html\n   */\n  private final ListProperty<String> fileExtensions;\n  /**\n   * Interpret unknown variable as containing boolean false flag.\n   */\n  private final Property<Boolean> unknownVarAsFalse;\n  /**\n   * Dry run, making pre-processing but without output\n   */\n  private final Property<Boolean> dryRun;\n  /**\n   * Allow merge preprocessed lines marked as block text for external processing.\n   *\n   * @since 7.2.0\n   */\n  private final Property<Boolean> allowBlocks;\n  /**\n   * Verbose mode.\n   */\n  private final Property<Boolean> verbose;\n  /**\n   * Clear target folder if it exists.\n   */\n  private final Property<Boolean> clearTarget;\n  /**\n   * Set base directory which will be used for relative source paths.\n   * By default it is '$projectDir'.\n   */\n  private final Property<File> baseDir;\n  /**\n   * Carefully reproduce last EOL in result files.\n   */\n  private final Property<Boolean> careForLastEol;\n  /**\n   * Keep comments in result files.\n   */\n  private final Property<Object> keepComments;\n  /**\n   * List of variables to be registered in preprocessor as global ones.\n   */\n  private final MapProperty<String, Object> vars;\n  /**\n   * List of patterns of folder paths to be excluded from preprocessing, It uses\n   * ANT path pattern format.\n   */\n  private final ListProperty<String> excludeFolders;\n  /**\n   * List of external files containing variable definitions.\n   */\n  private final ListProperty<String> configFiles;\n  /**\n   * Keep preprocessing directives in result files as commented ones, it is\n   * useful to not break line numeration in result files.\n   */\n  private final Property<Boolean> keepLines;\n  /**\n   * Turn on support of white spaces in preprocessor directives between '//' and\n   * the '#'.\n   */\n  private final Property<Boolean> allowWhitespaces;\n  /**\n   * Preserve indents in lines marked by '//$' and '//$$' directives. Directives\n   * will be replaced by white spaces chars.\n   */\n  private final Property<Boolean> preserveIndents;\n  /**\n   * Turn on check of content body compare with existing result file to prevent\n   * overwriting, if content is the same then preprocessor will not be writing\n   * new result content.\n   */\n  private final Property<Boolean> dontOverwriteSameContent;\n\n  /**\n   * Collection of all files which have been generated during preprocessing.\n   */\n  private final ConfigurableFileCollection outcomingFiles;\n\n  /**\n   * Collection of all files which have been used for preprocessing (including configuration files)\n   */\n  private final ConfigurableFileCollection incomingFiles;\n\n  @Inject\n  public JcpTask(final ObjectFactory factory) {\n    this.actionPreprocessorExtensions = factory.listProperty(String.class);\n    this.allowWhitespaces = factory.property(Boolean.class).convention(false);\n    this.careForLastEol = factory.property(Boolean.class).convention(false);\n    this.clearTarget = factory.property(Boolean.class).convention(false);\n    this.dontOverwriteSameContent = factory.property(Boolean.class).convention(false);\n    this.dryRun = factory.property(Boolean.class).convention(false);\n    this.allowBlocks = factory.property(Boolean.class).convention(false);\n    this.ignoreMissingSources = factory.property(Boolean.class).convention(false);\n    this.keepAttributes = factory.property(Boolean.class).convention(false);\n    this.keepComments = factory.property(Object.class).convention(false);\n    this.keepLines = factory.property(Boolean.class).convention(true);\n    this.preserveIndents = factory.property(Boolean.class).convention(false);\n    this.unknownVarAsFalse = factory.property(Boolean.class).convention(false);\n    this.verbose = factory.property(Boolean.class).convention(false);\n\n    this.targetEncoding = factory.property(String.class).convention(StandardCharsets.UTF_8.name());\n    this.sourceEncoding = factory.property(String.class).convention(StandardCharsets.UTF_8.name());\n    this.eol = factory.property(String.class).convention(System.lineSeparator());\n\n    this.vars = factory.mapProperty(String.class, Object.class);\n\n    this.sources = factory.listProperty(File.class);\n    this.configFiles = factory.listProperty(String.class);\n    this.excludeExtensions =\n        factory.listProperty(String.class).convention(Collections.singletonList(\"xml\"));\n    this.excludeFolders = factory.listProperty(String.class);\n    this.fileExtensions = factory.listProperty(String.class)\n        .convention(new ArrayList<>(Arrays.asList(\"java\", \"txt\", \"htm\", \"html\")));\n\n    this.baseDir = factory.property(File.class).convention(this.getProject().getProjectDir());\n    this.target = factory.property(File.class).convention(new File(this.getProject().getBuildDir(),\n        \"java-comment-preprocessor\" + File.separatorChar + this.getTaskIdentity().name));\n\n    this.incomingFiles = factory.fileCollection();\n    this.outcomingFiles = factory.fileCollection();\n  }\n\n  @OutputFiles\n  public FileCollection getOutcomingFiles() {\n    return this.outcomingFiles;\n  }\n\n  @Internal\n  public FileCollection getIncomingFiles() {\n    return this.incomingFiles;\n  }\n\n  @Internal\n  @Override\n  public String getDescription() {\n    return \"Preprocess sources and resources with JCP\";\n  }\n\n  @InputFiles\n  public ListProperty<File> getSources() {\n    return this.sources;\n  }\n\n  @Input\n  public Property<String> getEol() {\n    return this.eol;\n  }\n\n  @Input\n  public Property<Boolean> getKeepAttributes() {\n    return this.keepAttributes;\n  }\n\n  @Input\n  public Property<File> getTarget() {\n    return this.target;\n  }\n\n  @Input\n  public Property<String> getSourceEncoding() {\n    return this.sourceEncoding;\n  }\n\n  @Input\n  public Property<String> getTargetEncoding() {\n    return this.targetEncoding;\n  }\n\n  @Input\n  public Property<Boolean> getIgnoreMissingSources() {\n    return ignoreMissingSources;\n  }\n\n  @Input\n  public ListProperty<String> getExcludeExtensions() {\n    return excludeExtensions;\n  }\n\n  @Input\n  public ListProperty<String> getFileExtensions() {\n    return fileExtensions;\n  }\n\n  @Input\n  public Property<Boolean> getUnknownVarAsFalse() {\n    return unknownVarAsFalse;\n  }\n\n  @Input\n  public Property<Boolean> getDryRun() {\n    return dryRun;\n  }\n\n  @Input\n  public Property<Boolean> getAllowBlocks() {\n    return allowBlocks;\n  }\n\n  @Input\n  public Property<Boolean> getVerbose() {\n    return verbose;\n  }\n\n  @Input\n  public Property<Boolean> getClearTarget() {\n    return clearTarget;\n  }\n\n  @Input\n  public Property<File> getBaseDir() {\n    return baseDir;\n  }\n\n  @Input\n  public ListProperty<String> getActionPreprocessorExtensions() {\n    return actionPreprocessorExtensions;\n  }\n\n  @Input\n  public Property<Boolean> getCareForLastEol() {\n    return careForLastEol;\n  }\n\n  @Input\n  public Property<Object> getKeepComments() {\n    return keepComments;\n  }\n\n  @Input\n  public MapProperty<String, Object> getVars() {\n    return vars;\n  }\n\n  @Input\n  public ListProperty<String> getExcludeFolders() {\n    return excludeFolders;\n  }\n\n  @Input\n  public ListProperty<String> getConfigFiles() {\n    return configFiles;\n  }\n\n  @Input\n  public Property<Boolean> getKeepLines() {\n    return keepLines;\n  }\n\n  @Input\n  public Property<Boolean> getAllowWhitespaces() {\n    return allowWhitespaces;\n  }\n\n  @Input\n  public Property<Boolean> getPreserveIndents() {\n    return preserveIndents;\n  }\n\n  @Input\n  public Property<Boolean> getDontOverwriteSameContent() {\n    return dontOverwriteSameContent;\n  }\n\n  @TaskAction\n  public void preprocessTask() throws IOException {\n    final Logger logger = getProject().getLogger();\n\n    final File baseDirFile;\n    if (this.baseDir.isPresent()) {\n      baseDirFile = this.baseDir.get();\n    } else {\n      baseDirFile = this.getProject().getProjectDir();\n    }\n    logger.info(\"Base folder: {}\", baseDirFile);\n    final PreprocessorContext preprocessorContext = new PreprocessorContext(baseDirFile);\n\n    preprocessorContext.setPreprocessorLogger(new PreprocessorLogger() {\n      @Override\n      public void error(final String message) {\n        logger.error(message);\n      }\n\n      @Override\n      public void info(final String message) {\n        logger.info(message);\n      }\n\n      @Override\n      public void debug(final String message) {\n        logger.debug(message);\n      }\n\n      @Override\n      public void debug(final Supplier<String> supplier) {\n        if (logger.isDebugEnabled() && supplier != null) {\n          final String text = supplier.get();\n          if (text != null) {\n            logger.debug(text);\n          }\n        }\n      }\n\n      @Override\n      public void warning(final String message) {\n        logger.warn(message);\n      }\n    });\n\n    List<String> configFilesList = this.configFiles.get();\n    configFilesList.forEach(x -> {\n      final File cfgFile = new File(baseDirFile, x);\n      if (cfgFile.isFile()) {\n        logger.debug(\"Adding config file: \" + cfgFile);\n        preprocessorContext.registerConfigFile(cfgFile);\n      } else {\n        throw new TaskExecutionException(this, new IOException(\n            \"Can't find config file: \" + FilenameUtils.normalize(cfgFile.getAbsolutePath())));\n      }\n    });\n\n    final File targetFolder = this.target.get();\n    logger.info(\"Target folder: \" + targetFolder);\n    preprocessorContext.setTarget(targetFolder);\n\n    final List<File> sourcesList = this.sources.get();\n    if (sourcesList.isEmpty()) {\n      throw new TaskConfigurationException(JcpTask.ID,\n          \"Source folder list must be defined as 'sources'\", null);\n    }\n\n    List<File> preparedSourcesList = new ArrayList<>();\n    for (final File srcFolder : sourcesList) {\n      final File srcFolderFile =\n          srcFolder.isAbsolute() ? srcFolder : new File(baseDirFile, srcFolder.getPath());\n      if (!this.ignoreMissingSources.get() || srcFolderFile.isDirectory()) {\n        preparedSourcesList.add(srcFolderFile);\n      }\n      if (!srcFolderFile.isDirectory()) {\n        logger.debug(String.format(\"Src.folder doesn't exist: %s\", srcFolderFile));\n      }\n    }\n\n    logger.info(\"Source folders in use: \" + preparedSourcesList);\n\n    preprocessorContext.setSources(\n        preparedSourcesList.stream().map(File::getAbsolutePath).collect(Collectors.toList()));\n    preprocessorContext.setEol(this.eol.get());\n    preprocessorContext.setExcludeFolders(this.excludeFolders.get());\n    preprocessorContext.setDontOverwriteSameContent(this.dontOverwriteSameContent.get());\n    preprocessorContext.setClearTarget(this.clearTarget.get());\n    preprocessorContext.setCareForLastEol(this.careForLastEol.get());\n    preprocessorContext.setKeepComments(\n        findCommentRemoverForId(String.valueOf(this.keepComments.get())));\n    preprocessorContext.setDryRun(this.dryRun.get());\n    preprocessorContext.setAllowsBlocks(this.allowBlocks.get());\n    preprocessorContext.setKeepAttributes(this.keepAttributes.get());\n    preprocessorContext.setKeepLines(this.keepLines.get());\n    preprocessorContext.setAllowWhitespaces(this.allowWhitespaces.get());\n    preprocessorContext.setExcludeExtensions(this.excludeExtensions.get());\n    preprocessorContext.setExtensions(this.fileExtensions.get());\n    preprocessorContext.setPreserveIndents(this.preserveIndents.get());\n    preprocessorContext.setSourceEncoding(Charset.forName(this.sourceEncoding.get()));\n    preprocessorContext.setTargetEncoding(Charset.forName(this.targetEncoding.get()));\n    preprocessorContext.setUnknownVariableAsFalse(this.unknownVarAsFalse.get());\n    preprocessorContext.setVerbose(this.verbose.get());\n\n    fillContextByFoundServices(preprocessorContext);\n\n    if (!this.actionPreprocessorExtensions.get().isEmpty()) {\n      this.actionPreprocessorExtensions.get()\n          .forEach(x -> {\n            final String className = x.trim();\n            logger.info(\n                String.format(\"Detected action preprocessor extension class name: %s\", className));\n            preprocessorContext.addPreprocessorExtension(\n                findAndInstantiatePreprocessorExtensionForClassName(className));\n          });\n    }\n\n    this.vars.getOrElse(emptyMap()).entrySet().stream()\n        .filter(e -> {\n          if (e.getValue() == null) {\n            if (this.unknownVarAsFalse.get()) {\n              logger.warn(String.format(\n                  \"Global var '%s' ignored for null value (may be its content is empty in POM)\",\n                  e.getKey()));\n              return false;\n            } else {\n              throw new IllegalStateException(String.format(\n                  \"Global var '%s' has null value, to ignore it set flag unknownVarAsFalse\",\n                  e.getKey()));\n            }\n          } else {\n            return true;\n          }\n        })\n        .forEach(e -> {\n          logger.debug(\n              String.format(\"Registering global variable: %s=%s\", e.getKey(), e.getValue()));\n          preprocessorContext.setGlobalVariable(e.getKey(),\n              Value.recognizeRawString(String.valueOf(e.getValue())));\n        });\n\n    final JcpPreprocessor preprocessor = new JcpPreprocessor(preprocessorContext);\n\n    logger.debug(\"Preprocessing starting\");\n    preprocessor.execute();\n\n    final Collection<File> foundAllGeneratedFiles =\n        preprocessor.getContext().findAllProducedFiles();\n    final Collection<File> foundAllInputFiles = preprocessor.getContext().findAllInputFiles();\n\n    this.outcomingFiles.setFrom(foundAllGeneratedFiles);\n    this.incomingFiles.setFrom(foundAllInputFiles);\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/logger/PreprocessorLogger.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.logger;\n\nimport java.util.function.Supplier;\n\n/**\n * The interface describes a logger to be used by a preprocessor during its work\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic interface PreprocessorLogger {\n\n  /**\n   * Log an error message\n   *\n   * @param message the text to be output into the error log\n   */\n  void error(String message);\n\n  /**\n   * Log an information message\n   *\n   * @param message the text to be output into the information log\n   */\n  void info(String message);\n\n  /**\n   * Log a debug message\n   *\n   * @param message the text to be output into the debug log\n   * @since 6.0.1\n   */\n  void debug(String message);\n\n  /**\n   * Log a debug message\n   *\n   * @param message text supplier of text to be output into the debug log\n   * @since 7.3.3\n   */\n  default void debug(Supplier<String> supplier) {\n    if (supplier != null) {\n      this.debug(supplier.get());\n    }\n  }\n\n  /**\n   * Log a warning message\n   *\n   * @param message the text to be output into the warning log\n   */\n  void warning(String message);\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/logger/SystemOutLogger.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.logger;\n\n/**\n * An Easy logger which just output log messages into the system output streams\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class SystemOutLogger implements PreprocessorLogger {\n\n  /**\n   * Name of system property to enable debug level logging.\n   */\n  public static final String PROPERTY_DEBUG_FLAG = \"jcp.log.debug\";\n\n  private static final boolean FLAG_DEBUG_LEVEL =\n      Boolean.parseBoolean(System.getProperty(PROPERTY_DEBUG_FLAG));\n\n\n  @Override\n  public int hashCode() {\n    return System.out.hashCode();\n  }\n\n  @Override\n  public boolean equals(final Object value) {\n    return value instanceof SystemOutLogger;\n  }\n\n  @Override\n  public void error(final String text) {\n    if (text != null) {\n      final String out = \"[JCP.ERR] \" + text;\n      System.err.println(out);\n    }\n  }\n\n  @Override\n  public void info(final String text) {\n    if (text != null) {\n      final String out = \"[JCP.INFO] \" + text;\n      System.out.println(out);\n    }\n  }\n\n  @Override\n  public void warning(final String text) {\n    if (text != null) {\n      final String out = \"[JCP.WARN] \" + text;\n      System.out.println(out);\n    }\n  }\n\n  @Override\n  public void debug(final String text) {\n    if (FLAG_DEBUG_LEVEL && text != null) {\n      final String out = \"[JCP.DEBUG] \" + text;\n      System.out.println(out);\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/maven/MavenPropertiesImporter.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.maven;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.context.SpecialVariableProcessor;\nimport com.igormaznitsa.jcp.expression.Value;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.HashMap;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.Properties;\nimport java.util.Set;\nimport java.util.regex.Pattern;\nimport org.apache.maven.execution.MavenSession;\nimport org.apache.maven.model.Profile;\nimport org.apache.maven.project.MavenProject;\n\n/**\n * The class imports some properties from the maven which can be accessible from preprocessed sources as global variables\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class MavenPropertiesImporter implements SpecialVariableProcessor {\n\n  private static final Pattern PATTERN_FOR_PROPERTY_WHICH_CAN_CONTAIN_PRIVATE_INFO =\n      Pattern.compile(\"key|pass\", Pattern.CASE_INSENSITIVE);\n\n  private static final Set<String> TO_IMPORT = Set.of(\n      \"project.name\",\n      \"project.version\",\n      \"project.url\",\n      \"project.packaging\",\n      \"project.modelVersion\",\n      \"project.inceptionYear\",\n      \"project.id\",\n      \"project.groupId\",\n      \"project.description\",\n      \"project.artifact.id\",\n      \"project.artifact.artifactId\",\n      \"project.artifact.baseVersion\",\n      \"project.artifact.dependencyConflictId\",\n      \"project.artifact.downloadUrl\",\n      \"project.artifact.groupId\",\n      \"project.artifact.scope\",\n      \"project.artifact.type\",\n      \"project.artifact.version\",\n      \"project.build.directory\",\n      \"project.build.defaultGoal\",\n      \"project.build.outputDirectory\",\n      \"project.build.scriptSourceDirectory\",\n      \"project.build.sourceDirectory\",\n      \"project.build.testOutputDirectory\",\n      \"project.build.testSourceDirectory\",\n      \"project.organization.name\",\n      \"project.organization.url\");\n\n  private final Map<String, Value> internalVarMap = new HashMap<>();\n  private final MavenProject project;\n  private final MavenSession session;\n\n  public MavenPropertiesImporter(final PreprocessorContext context,\n                                 final MavenProject project,\n                                 final MavenSession session,\n                                 final boolean logAddedProperties) {\n    this.session = session;\n    this.project = project;\n    for (final String paramName : TO_IMPORT) {\n      final String varName = \"mvn.\" + paramName.toLowerCase(Locale.ROOT);\n      final String value = getProperty(this.project, paramName);\n      addVariableIntoInternalMap(context, varName, Value.valueOf(value), logAddedProperties);\n    }\n\n    // add active profile ids\n    final StringBuilder profileIds = new StringBuilder();\n    for (final Profile profile : project.getActiveProfiles()) {\n      if (profileIds.length() > 0) {\n        profileIds.append(';');\n      }\n      profileIds.append(profile.getId());\n    }\n    addVariableIntoInternalMap(context, \"mvn.project.activeprofiles\",\n        Value.valueOf(profileIds.toString()), logAddedProperties);\n\n    // add properties\n    for (final String propertyName : this.project.getProperties().stringPropertyNames()) {\n      final String varName =\n          \"mvn.project.property.\" + propertyName.toLowerCase(Locale.ROOT).replace(' ', '_');\n      final String value = this.findPropertyValue(propertyName);\n      if (value != null) {\n        addVariableIntoInternalMap(context, varName, Value.valueOf(value), logAddedProperties);\n      }\n    }\n  }\n\n  static String getProperty(final MavenProject project, final String name) {\n    final String[] splitted = name.split(\"\\\\.\");\n\n    Object root = null;\n\n    if (\"project\".equals(splitted[0])) {\n      root = project;\n    }\n\n    try {\n      if (root == null) {\n        throw new IllegalArgumentException(\n            \"Unsupported root object detected [\" + splitted[0] + ']');\n      } else {\n        for (int i = 1; i < splitted.length - 1; i++) {\n          final Method getter = root.getClass().getMethod(normalizeGetter(splitted[i]));\n          root = getter.invoke(root);\n          if (root == null) {\n            return \"\";\n          }\n        }\n\n        final Method finalStringGetter =\n            root.getClass().getMethod(normalizeGetter(splitted[splitted.length - 1]));\n        final Object result = finalStringGetter.invoke(root);\n        return result == null ? \"\" : result.toString();\n      }\n    } catch (NoSuchMethodException ex) {\n      throw new RuntimeException(\"Can't find method\", ex);\n    } catch (IllegalAccessException ex) {\n      throw new RuntimeException(\"Security exception\", ex);\n    } catch (InvocationTargetException ex) {\n      throw new RuntimeException(\"Exception during invocation\", ex.getCause());\n    }\n  }\n\n  static String normalizeGetter(final String str) {\n    return \"get\" + Character.toUpperCase(str.charAt(0)) + str.substring(1);\n  }\n\n  private String findPropertyValue(final String key) {\n    final Properties properties = new Properties(this.project.getProperties());\n    properties.putAll(this.session.getSystemProperties());\n    properties.putAll(this.session.getUserProperties());\n    return properties.getProperty(key);\n  }\n\n  private void printInfoAboutVarIntoLog(final PreprocessorContext context, final String varName,\n                                        final String value) {\n    final boolean possibleContainsPrivateInfo =\n        PATTERN_FOR_PROPERTY_WHICH_CAN_CONTAIN_PRIVATE_INFO.matcher(varName).find();\n    final String textValue =\n        possibleContainsPrivateInfo ? \"***** [hidden because may contain private info]\" : value;\n    context.logInfo(\"Added MAVEN property \" + varName + '=' + textValue);\n  }\n\n  private void addVariableIntoInternalMap(final PreprocessorContext context, final String name,\n                                          final Value value, final boolean verbose) {\n    if (internalVarMap.containsKey(name)) {\n      throw context.makeException(\"Duplicated importing value detected [\" + name + ']', null);\n    }\n    internalVarMap.put(name, value);\n    if (verbose) {\n      printInfoAboutVarIntoLog(context, name, value.asString());\n    }\n  }\n\n  @Override\n  public Set<String> getVariableNames() {\n    return this.internalVarMap.keySet();\n  }\n\n  @Override\n  public Value getVariable(final String varName, final PreprocessorContext context) {\n    if (!internalVarMap.containsKey(varName)) {\n      throw new IllegalArgumentException(\"Unsupported property request detected [\" + varName + ']');\n    }\n    return internalVarMap.get(varName);\n  }\n\n  @Override\n  public void setVariable(final String varName, final Value value,\n                          final PreprocessorContext context) {\n    throw new UnsupportedOperationException(\n        \"An attempt to change a maven property detected, those properties are accessible only for reading [\" +\n            varName + ']');\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/maven/PreprocessMojo.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.maven;\n\nimport static com.igormaznitsa.jcp.utils.GetUtils.ensureNonNull;\nimport static com.igormaznitsa.jcp.utils.PreprocessorUtils.fillContextByFoundServices;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\nimport lombok.AccessLevel;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.Setter;\nimport org.apache.commons.text.StringEscapeUtils;\nimport org.apache.maven.execution.MavenSession;\nimport org.apache.maven.plugin.AbstractMojo;\nimport org.apache.maven.plugin.AbstractMojoExecutionException;\nimport org.apache.maven.plugin.MojoExecutionException;\nimport org.apache.maven.plugin.MojoFailureException;\nimport org.apache.maven.plugins.annotations.LifecyclePhase;\nimport org.apache.maven.plugins.annotations.Mojo;\nimport org.apache.maven.plugins.annotations.Parameter;\nimport org.apache.maven.project.MavenProject;\n\n/**\n * Mojo to preprocess either standard maven project source roots or custom source roots and place prepsocessed result into defined target folder.\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Mojo(name = \"preprocess\", defaultPhase = LifecyclePhase.GENERATE_SOURCES, threadSafe = true)\npublic class PreprocessMojo extends AbstractMojo implements PreprocessorLogger {\n\n  /**\n   * Maven project source roots for compilation phase.\n   */\n  @Setter(AccessLevel.NONE)\n  @Parameter(alias = \"compileSourceRoots\", defaultValue = \"${project.compileSourceRoots}\", required = true, readonly = true)\n  private List<String> compileSourceRoots = new ArrayList<>();\n\n  /**\n   * Maven project test source roots for test phase.\n   */\n  @Setter(AccessLevel.NONE)\n  @Parameter(alias = \"testCompileSourceRoots\", defaultValue = \"${project.testCompileSourceRoots}\", required = true, readonly = true)\n  private List<String> testCompileSourceRoots = new ArrayList<>();\n\n  /**\n   * Maven project to be preprocessed.\n   */\n  @Setter(AccessLevel.NONE)\n  @Parameter(defaultValue = \"${project}\", required = true, readonly = true)\n  private MavenProject project;\n\n  /**\n   * Maven session to be preprocessed.\n   *\n   * @since 7.0.5\n   */\n  @Setter(AccessLevel.NONE)\n  @Parameter(defaultValue = \"${session}\", required = true, readonly = true)\n  private MavenSession session;\n\n  /**\n   * Source root folders for preprocessing, if it is empty then project provided folders will be used.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"sources\")\n  private List<String> sources = null;\n\n  /**\n   * End of line string to be used in reprocessed results. It supports java escaping chars.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"eol\", property = \"jcp.line.separator\", defaultValue = \"${line.separator}\")\n  private String eol = null;\n\n  /**\n   * List of class names to be used as action preprocessor extensions. The class must have default constructor.\n   *\n   * @see com.igormaznitsa.jcp.extension.PreprocessorExtension\n   * @since 7.2.2\n   */\n  @Parameter(alias = \"actionPreprocessorExtensions\", property = \"jcp.action.preprocessor.extensions\", defaultValue = \"\")\n  private List<String> actionPreprocessorExtensions = List.of();\n\n  /**\n   * Keep attributes for preprocessing file and copy them to result one.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"keepAttributes\", defaultValue = \"false\")\n  private boolean keepAttributes = false;\n\n  /**\n   * Target folder to place preprocessing result in regular source processing phase.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"target\", defaultValue = \"${project.build.directory}${file.separator}generated-sources${file.separator}preprocessed\")\n  private File target = null;\n\n  /**\n   * Target folder to place preprocessing result in test source processing phase.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"targetTest\", defaultValue = \"${project.build.directory}${file.separator}generated-test-sources${file.separator}preprocessed\")\n  private File targetTest = null;\n\n  /**\n   * Encoding for text read operations.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"sourceEncoding\", defaultValue = \"${project.build.sourceEncoding}\")\n  private String sourceEncoding = StandardCharsets.UTF_8.name();\n\n  /**\n   * Encoding for text write operations.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"targetEncoding\", defaultValue = \"${project.build.sourceEncoding}\")\n  private String targetEncoding = StandardCharsets.UTF_8.name();\n\n  /**\n   * Flag to ignore missing source folders, if false then mojo fail for any missing source folder, if true then missing folder will be ignored.\n   *\n   * @since 6.1.1\n   */\n  @Parameter(alias = \"ignoreMissingSources\", defaultValue = \"false\")\n  private boolean ignoreMissingSources = false;\n\n  /**\n   * List of file extensions to be excluded from preprocessing. By default excluded xml.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"excludeExtensions\")\n  private List<String> excludeExtensions = Collections.singletonList(\"xml\");\n\n  /**\n   * List of file extensions to be included into preprocessing. By default java,txt,htm,html\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"extensions\")\n  private List<String> extensions = new ArrayList<>(Arrays.asList(\"java\", \"txt\", \"htm\", \"html\"));\n\n  /**\n   * Recognize a unknown variable as containing boolean false flag.\n   */\n  @Parameter(alias = \"unknownVarAsFalse\", defaultValue = \"false\")\n  private boolean unknownVarAsFalse = false;\n\n  /**\n   * Dry run, making preprocessing but without output\n   *\n   * @since 7.0.0.\n   */\n  @Parameter(alias = \"dryRun\", defaultValue = \"false\")\n  private boolean dryRun = false;\n\n  /**\n   * Allows merge preprocessed text lines as single text block for external processing.\n   *\n   * @since 7.2.0.\n   */\n  @Parameter(alias = \"allowBlocks\", defaultValue = \"false\")\n  private boolean allowBlocks = false;\n\n  /**\n   * Verbose mode.\n   */\n  @Parameter(alias = \"verbose\", defaultValue = \"false\")\n  private boolean verbose = false;\n\n  /**\n   * Clear target folder if it exists.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"clearTarget\", defaultValue = \"false\")\n  private boolean clearTarget = false;\n\n  /**\n   * Set base directory which will be used for relative source paths.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"baseDir\", defaultValue = \"${project.basedir}\")\n  private File baseDir = new File(\".\");\n\n  /**\n   * Carefully reproduce last EOL in result files.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"careForLastEol\", defaultValue = \"false\")\n  private boolean careForLastEol = false;\n\n  /**\n   * Replace source root folders in maven project after preprocessing for following processing.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"replaceSources\", defaultValue = \"true\")\n  private boolean replaceSources = true;\n\n  /**\n   * Keep comments in result files.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"keepComments\", defaultValue = \"true\")\n  private String keepComments = CommentRemoverType.KEEP_ALL.name();\n\n  /**\n   * List of variables to be registered in preprocessor as global ones.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"vars\")\n  private Map<String, String> vars = new HashMap<>();\n\n  /**\n   * List of patterns of folder paths to be excluded from preprocessing, It uses ANT path pattern format.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"excludeFolders\")\n  private List<String> excludeFolders = new ArrayList<>();\n\n  /**\n   * List of external files containing variable definitions.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"configFiles\")\n  private List<String> configFiles = new ArrayList<>();\n\n  /**\n   * Keep preprocessing directives in result files as commented ones, it is useful to not break line numeration in result files.\n   */\n  @Parameter(alias = \"keepLines\", defaultValue = \"true\")\n  private boolean keepLines = true;\n\n  /**\n   * Turn on support of white spaces in preprocessor directives between '//' and the '#'.\n   */\n  @Parameter(alias = \"allowWhitespaces\", defaultValue = \"false\")\n  private boolean allowWhitespaces = false;\n\n  /**\n   * Preserve indents in lines marked by '//$' and '//$$' directives. Directives will be replaced by white spaces chars.\n   */\n  @Parameter(alias = \"preserveIndents\", defaultValue = \"false\")\n  private boolean preserveIndents = false;\n\n  /**\n   * Turn on test sources root use.\n   *\n   * @since 5.3.4\n   */\n  @Parameter(alias = \"useTestSources\", defaultValue = \"false\")\n  private boolean useTestSources = false;\n\n  /**\n   * Skip preprocessing. Also can be defined by property 'jcp.preprocess.skip'\n   *\n   * @since 6.1.1\n   */\n  @Parameter(alias = \"skip\", property = \"jcp.preprocess.skip\", defaultValue = \"false\")\n  private boolean skip = false;\n\n  /**\n   * Turn on check of content body compare with existing result file to prevent overwriting, if content is the same then preprocessor will not be writing new result content.\n   *\n   * @since 7.0.0\n   */\n  @Parameter(alias = \"dontOverwriteSameContent\", defaultValue = \"false\")\n  private boolean dontOverwriteSameContent = false;\n\n\n  private List<String> formSourceRootList() {\n    List<String> result = Collections.emptyList();\n    if (this.getSources() == null) {\n      if (this.project != null) {\n        result = (this.isUseTestSources() ? this.testCompileSourceRoots : this.compileSourceRoots)\n            .stream()\n            .filter(Objects::nonNull)\n            .map(File::new)\n            .peek(x -> {\n              if (!x.isDirectory()) {\n                getLog().debug(String.format(\"Src.folder doesn't exist: %s\", x));\n              }\n            })\n            .filter(x -> !this.isIgnoreMissingSources() || x.isDirectory())\n            .map(File::getAbsolutePath)\n            .collect(Collectors.toList());\n      }\n    } else {\n      result = new ArrayList<>(this.getSources());\n    }\n    return result;\n  }\n\n  private void replaceSourceRootByPreprocessingDestinationFolder(final PreprocessorContext context)\n      throws IOException {\n    if (this.project != null) {\n      final List<PreprocessorContext.SourceFolder> sourceFolders = context.getSources();\n\n      final List<String> sourceRoots =\n          this.isUseTestSources() ? this.testCompileSourceRoots : this.compileSourceRoots;\n      final List<String> sourceRootsAsCanonical = new ArrayList<>();\n      for (final String src : sourceRoots) {\n        sourceRootsAsCanonical.add(new File(src).getCanonicalPath());\n      }\n\n      for (final PreprocessorContext.SourceFolder folder : sourceFolders) {\n        int index = sourceRoots.indexOf(folder.getAsString());\n        if (index < 0) {\n          // check for canonical paths\n          final String canonicalPath = folder.getAsFile().getCanonicalPath();\n          index = sourceRootsAsCanonical.indexOf(canonicalPath);\n        }\n        if (index >= 0) {\n          info(\"Source root is removed from the source root list: \" + sourceRoots.get(index));\n          sourceRoots.remove(index);\n        }\n      }\n\n      final String destinationDir = context.getTarget().getCanonicalPath();\n\n      sourceRoots.add(destinationDir);\n      info(\"Source root is enlisted: \" + destinationDir);\n    }\n  }\n\n\n  PreprocessorContext makePreprocessorContext() throws AbstractMojoExecutionException {\n    final PreprocessorContext context = new PreprocessorContext(this.getBaseDir());\n    context.setPreprocessorLogger(this);\n\n    if (this.project != null) {\n      final MavenPropertiesImporter mavenPropertiesImporter =\n          new MavenPropertiesImporter(context,\n              this.project,\n              this.session,\n              isVerbose() || getLog().isDebugEnabled()\n          );\n      context.registerSpecialVariableProcessor(mavenPropertiesImporter);\n    }\n\n    if (this.actionPreprocessorExtensions != null &&\n        !this.actionPreprocessorExtensions.isEmpty()) {\n      this.actionPreprocessorExtensions\n          .forEach(x -> {\n            final String extensionClassName = x.trim();\n            info(\"Adding preprocessor action extension class: \" + extensionClassName);\n            context.addPreprocessorExtension(\n                PreprocessorUtils.findAndInstantiatePreprocessorExtensionForClassName(\n                    extensionClassName));\n          });\n    }\n\n    context.setSources(formSourceRootList());\n    context.setTarget((this.isUseTestSources() ? this.getTargetTest() : this.getTarget()));\n\n    context.setSourceEncoding(Charset.forName(this.getSourceEncoding().trim()));\n    context.setTargetEncoding(Charset.forName(this.getTargetEncoding().trim()));\n\n    context.setExcludeFolders(this.getExcludeFolders());\n    context.setExcludeExtensions(this.getExcludeExtensions());\n    context.setExtensions(this.getExtensions());\n\n    if (this.getEol() != null) {\n      context.setEol(StringEscapeUtils.unescapeJava(this.getEol()));\n    }\n\n    info(\"Source folders: \" +\n        context.getSources().stream().map(PreprocessorContext.SourceFolder::getAsString)\n            .collect(Collectors.joining(File.pathSeparator)));\n    info(\"Target folder: \" + context.getTarget());\n\n    context.setUnknownVariableAsFalse(this.isUnknownVarAsFalse());\n    context.setDontOverwriteSameContent(this.isDontOverwriteSameContent());\n    context.setClearTarget(this.isClearTarget());\n    context.setCareForLastEol(this.isCareForLastEol());\n    context.setKeepComments(PreprocessorUtils.findCommentRemoverForId(this.getKeepComments()));\n    context.setVerbose(getLog().isDebugEnabled() || this.isVerbose());\n    context.setKeepLines(this.isKeepLines());\n    context.setDryRun(this.isDryRun());\n    context.setAllowsBlocks(this.isAllowBlocks());\n    context.setAllowWhitespaces(this.isAllowWhitespaces());\n    context.setPreserveIndents(this.isPreserveIndents());\n    context.setExcludeFolders(this.getExcludeFolders());\n    context.setKeepAttributes(this.isKeepAttributes());\n\n    this.configFiles.forEach(x -> context.registerConfigFile(new File(x)));\n\n    // register global vars\n    try {\n      this.getVars().entrySet().stream()\n          .filter(e -> {\n            final String key = e.getKey();\n            final String value = e.getValue();\n            if (value == null) {\n              if (this.isUnknownVarAsFalse()) {\n                getLog().warn(String.format(\n                    \"Global var '%s' ignored for null value (may be its content is empty in POM)\",\n                    key));\n                return false;\n              } else {\n                throw new IllegalStateException(String.format(\n                    \"Global var '%s' has null value (may be its content is empty in POM), to ignore it set unknownVarAsFalse as true\",\n                    key));\n              }\n            } else {\n              return true;\n            }\n          })\n          .forEach(e -> {\n            getLog().debug(\n                String.format(\"Register global var: '%s' <- '%s'\", e.getKey(), e.getValue()));\n            context.setGlobalVariable(e.getKey(), Value.recognizeRawString(e.getValue()));\n          });\n    } catch (final IllegalStateException ex) {\n      getLog().error(ex.getMessage());\n      throw new MojoFailureException(ex.getMessage());\n    }\n    return context;\n  }\n\n  @Override\n  public void execute() throws MojoExecutionException, MojoFailureException {\n    if (this.isSkip()) {\n      getLog().info(\"Skip preprocessing\");\n    } else {\n      final PreprocessorContext context;\n      try {\n        context = makePreprocessorContext();\n        fillContextByFoundServices(context);\n      } catch (Exception ex) {\n        final PreprocessorException newException =\n            PreprocessorException.extractPreprocessorException(ex);\n        throw new MojoExecutionException(\n            newException == null ? ex.getMessage() : newException.toString(),\n            newException == null ? ex : newException);\n      }\n\n      if (context.getSources().isEmpty()) {\n        if (this.isIgnoreMissingSources()) {\n          getLog().warn(\"Source folders are not provided, preprocessing is ignored.\");\n        } else {\n          throw new MojoFailureException(\n              \"Source folders are not provided, check parameters and project type\");\n        }\n      } else {\n        try {\n          final JcpPreprocessor preprocessor = new JcpPreprocessor(context);\n          preprocessor.execute();\n          if (this.isReplaceSources()) {\n            replaceSourceRootByPreprocessingDestinationFolder(context);\n          }\n        } catch (Exception ex) {\n          final PreprocessorException pp = PreprocessorException.extractPreprocessorException(ex);\n          throw new MojoFailureException(\n              pp == null ? ex.getMessage() : PreprocessorException.referenceAsString('.', pp),\n              pp == null ? ex : pp);\n        }\n      }\n    }\n  }\n\n  @Override\n  public void error(final String message) {\n    getLog().error(ensureNonNull(message, \"<null>\"));\n  }\n\n  @Override\n  public void info(final String message) {\n    getLog().info(ensureNonNull(message, \"<null>\"));\n  }\n\n  @Override\n  public void warning(final String message) {\n    getLog().warn(ensureNonNull(message, \"<null>\"));\n  }\n\n  @Override\n  public void debug(final String message) {\n    getLog().debug(ensureNonNull(message, \"<null>\"));\n  }\n\n  @Override\n  public void debug(Supplier<String> supplier) {\n    if (getLog().isDebugEnabled()) {\n      final String text = supplier.get();\n      if (text != null) {\n        getLog().debug(text);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/removers/AbstractCommentRemover.java",
    "content": "package com.igormaznitsa.jcp.removers;\n\nimport static java.util.Objects.requireNonNull;\n\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.io.Writer;\n\npublic abstract class AbstractCommentRemover {\n  protected final Reader srcReader;\n  protected final Writer targetWriter;\n\n  protected final boolean whiteSpaceAllowed;\n\n  protected AbstractCommentRemover(\n      final Reader src,\n      final Writer target,\n      final boolean whiteSpaceAllowed\n  ) {\n    requireNonNull(src, \"The reader is null\");\n    requireNonNull(target, \"The writer is null\");\n    this.srcReader = src;\n    this.targetWriter = target;\n    this.whiteSpaceAllowed = whiteSpaceAllowed;\n  }\n\n  public static AbstractCommentRemover makeCommentRemover(\n      final CommentRemoverType keepComments,\n      final Reader src,\n      final Writer dst,\n      final boolean whiteSpaceAllowed) {\n    switch (keepComments) {\n      case KEEP_ALL:\n        return new JustCopyRemover(src, dst, whiteSpaceAllowed);\n      case REMOVE_C_STYLE:\n        return new CStyleCommentRemover(src, dst, whiteSpaceAllowed);\n      case REMOVE_JCP_ONLY:\n        return new JcpCommentLineRemover(src, dst, whiteSpaceAllowed);\n      default:\n        throw new IllegalStateException(\"Unsupported keep comments value: \" + keepComments);\n    }\n  }\n\n  public abstract Writer process() throws IOException;\n\n  protected void skipTillNextString() throws IOException {\n    while (!Thread.currentThread().isInterrupted()) {\n      final int chr = srcReader.read();\n      if (chr < 0) {\n        return;\n      }\n\n      if (chr == '\\n') {\n        this.targetWriter.write(chr);\n        return;\n      }\n    }\n  }\n\n  protected void skipTillClosingJavaComments() throws IOException {\n    boolean starFound = false;\n\n    while (!Thread.currentThread().isInterrupted()) {\n      final int chr = srcReader.read();\n      if (chr < 0) {\n        return;\n      }\n      if (starFound) {\n        if (chr == '/') {\n          return;\n        } else {\n          starFound = chr == '*';\n        }\n      } else if (chr == '*') {\n        starFound = true;\n      }\n    }\n  }\n\n  protected void copyTillClosingJavaComments() throws IOException {\n    boolean starFound = false;\n\n    while (!Thread.currentThread().isInterrupted()) {\n      final int chr = this.srcReader.read();\n      if (chr < 0) {\n        return;\n      }\n      this.targetWriter.write(chr);\n      if (starFound) {\n        if (chr == '/') {\n          return;\n        } else {\n          starFound = chr == '*';\n        }\n      } else if (chr == '*') {\n        starFound = true;\n      }\n    }\n  }\n\n  protected void copyTillNextString() throws IOException {\n    while (!Thread.currentThread().isInterrupted()) {\n      final int chr = srcReader.read();\n      if (chr < 0) {\n        return;\n      } else {\n        this.targetWriter.write(chr);\n        if (chr == '\\n') {\n          break;\n        }\n      }\n    }\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/removers/CStyleCommentRemover.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.removers;\n\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.io.Writer;\n\n/**\n * A remover allows to cut off all Java like comments from a reader and write the result into a writer\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class CStyleCommentRemover extends AbstractCommentRemover {\n\n  public CStyleCommentRemover(final Reader src, final Writer dst,\n                              final boolean whiteSpacesAllowed) {\n    super(src, dst, whiteSpacesAllowed);\n  }\n\n  @Override\n  public Writer process() throws IOException {\n    final int STATE_NORMAL = 0;\n    final int STATE_IN_STRING = 1;\n    final int STATE_NEXT_SPECIAL_CHAR = 2;\n    final int STATE_FORWARD_SLASH = 3;\n\n    int state = STATE_NORMAL;\n\n    while (!Thread.currentThread().isInterrupted()) {\n      final int chr = this.srcReader.read();\n      if (chr < 0) {\n        break;\n      }\n\n      switch (state) {\n        case STATE_NORMAL: {\n          switch (chr) {\n            case '\\\"': {\n              targetWriter.write(chr);\n              state = STATE_IN_STRING;\n            }\n            break;\n            case '/': {\n              state = STATE_FORWARD_SLASH;\n            }\n            break;\n            default: {\n              targetWriter.write(chr);\n            }\n            break;\n          }\n        }\n        break;\n        case STATE_FORWARD_SLASH: {\n          switch (chr) {\n            case '*': {\n              skipTillClosingJavaComments();\n              state = STATE_NORMAL;\n            }\n            break;\n            case '/': {\n              skipTillNextString();\n              state = STATE_NORMAL;\n            }\n            break;\n            default: {\n              targetWriter.write('/');\n              targetWriter.write(chr);\n              state = STATE_NORMAL;\n            }\n            break;\n          }\n        }\n        break;\n        case STATE_IN_STRING: {\n          switch (chr) {\n            case '\\\\': {\n              state = STATE_NEXT_SPECIAL_CHAR;\n            }\n            break;\n            case '\\\"': {\n              state = STATE_NORMAL;\n            }\n            break;\n            default:\n              break;\n          }\n          targetWriter.write(chr);\n        }\n        break;\n        case STATE_NEXT_SPECIAL_CHAR: {\n          targetWriter.write(chr);\n          state = STATE_IN_STRING;\n        }\n        break;\n        default:\n          throw new IllegalStateException(\"Unexpected state: \" + state);\n      }\n    }\n    return targetWriter;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/removers/JcpCommentLineRemover.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.removers;\n\nimport static com.igormaznitsa.jcp.directives.AbstractDirectiveHandler.PREFIX_FOR_KEEPING_LINES;\nimport static com.igormaznitsa.jcp.directives.AbstractDirectiveHandler.PREFIX_FOR_KEEPING_LINES_PROCESSED_DIRECTIVES;\n\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.io.Writer;\n\n/**\n * A remover allows to cut off all Java like comments contains JCP directives (single line comments started by '#' or '$')\n * from a reader and write the result into a writer.\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n * @since 7.1.0\n */\npublic class JcpCommentLineRemover extends AbstractCommentRemover {\n\n  public JcpCommentLineRemover(final Reader src, final Writer dst,\n                               final boolean whiteSpaceAllowed) {\n    super(src, dst, whiteSpaceAllowed);\n  }\n\n  @Override\n  public Writer process() throws IOException {\n    final int STATE_NORMAL = 0;\n    final int STATE_FORWARD_SLASH = 1;\n    final int STATE_POSSIBLE_JCP = 2;\n\n    final StringBuilder jcpBuffer = new StringBuilder();\n\n    int state = STATE_NORMAL;\n\n    while (!Thread.currentThread().isInterrupted()) {\n      final int chr = this.srcReader.read();\n      if (chr < 0) {\n        break;\n      }\n\n      switch (state) {\n        case STATE_NORMAL: {\n          if (chr == '/') {\n            state = STATE_FORWARD_SLASH;\n          } else if (Character.isWhitespace(chr)) {\n            this.targetWriter.write(chr);\n          } else {\n            this.targetWriter.write(chr);\n            this.copyTillNextString();\n          }\n        }\n        break;\n        case STATE_POSSIBLE_JCP: {\n          switch (chr) {\n            case '$':\n            case '#': {\n              if (jcpBuffer.toString().equals(\"//\") ||\n                  (jcpBuffer.substring(2).trim().isEmpty() && this.whiteSpaceAllowed)) {\n                jcpBuffer.setLength(0);\n                skipTillNextString();\n                state = STATE_NORMAL;\n              } else {\n                this.targetWriter.write(jcpBuffer.toString());\n                this.targetWriter.write(chr);\n                this.copyTillNextString();\n              }\n            }\n            break;\n            default: {\n              jcpBuffer.append((char) chr);\n              final String currentBuffer = jcpBuffer.toString();\n              if (currentBuffer.startsWith(PREFIX_FOR_KEEPING_LINES) ||\n                  currentBuffer.startsWith(PREFIX_FOR_KEEPING_LINES_PROCESSED_DIRECTIVES)) {\n                jcpBuffer.setLength(0);\n                this.skipTillNextString();\n                state = STATE_NORMAL;\n              } else if (chr == '\\n') {\n                this.targetWriter.write(currentBuffer);\n                jcpBuffer.setLength(0);\n                state = STATE_NORMAL;\n              } else if ((!PREFIX_FOR_KEEPING_LINES.startsWith(currentBuffer) &&\n                  !PREFIX_FOR_KEEPING_LINES_PROCESSED_DIRECTIVES.startsWith(currentBuffer)) &&\n                  (!this.whiteSpaceAllowed || !Character.isSpaceChar(chr))) {\n                jcpBuffer.setLength(0);\n                this.targetWriter.write(currentBuffer);\n                this.copyTillNextString();\n                state = STATE_NORMAL;\n              }\n            }\n          }\n        }\n        break;\n        case STATE_FORWARD_SLASH: {\n          switch (chr) {\n            case '*': {\n              this.targetWriter.write(\"/*\");\n              copyTillClosingJavaComments();\n              state = STATE_NORMAL;\n            }\n            break;\n            case '/': {\n              jcpBuffer.append(\"//\");\n              state = STATE_POSSIBLE_JCP;\n            }\n            break;\n            default: {\n              targetWriter.write('/');\n              targetWriter.write(chr);\n              state = STATE_NORMAL;\n            }\n            break;\n          }\n        }\n        break;\n        default:\n          throw new IllegalStateException(\"Unexpected state: \" + state);\n      }\n    }\n    if (jcpBuffer.length() > 0) {\n      this.targetWriter.write(jcpBuffer.toString());\n    }\n    return this.targetWriter;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/removers/JustCopyRemover.java",
    "content": "package com.igormaznitsa.jcp.removers;\n\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.io.Writer;\n\npublic class JustCopyRemover extends AbstractCommentRemover {\n\n  public JustCopyRemover(final Reader src, final Writer dst,\n                         final boolean whiteSpaceAllowed) {\n    super(src, dst, whiteSpaceAllowed);\n  }\n\n  @Override\n  public Writer process() throws IOException {\n    final char[] buffer = new char[32768];\n    while (!Thread.currentThread().isInterrupted()) {\n      final int read = this.srcReader.read(buffer);\n      if (read < 0) {\n        break;\n      }\n      this.targetWriter.write(buffer, 0, read);\n    }\n    return this.targetWriter;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/utils/AntPathMatcher.java",
    "content": "package com.igormaznitsa.jcp.utils;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.StringTokenizer;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * Extracted from <a href=\"https://github.com/spring-projects/spring-framework/blob/main/spring-core/src/main/java/org/springframework/util/AntPathMatcher.java\">Spring utility Ant pattern matcher</a>.\n * removed non-used methods and fields.\n */\npublic class AntPathMatcher {\n\n  public static final String DEFAULT_PATH_SEPARATOR = \"/\";\n  private static final int CACHE_TURNOFF_THRESHOLD = 65536;\n  private static final char[] WILDCARD_CHARS = {'*', '?', '{'};\n  private static final String[] EMPTY_STRING_ARRAY = {};\n  final Map<String, AntPathStringMatcher> stringMatcherCache = new ConcurrentHashMap<>(256);\n  private final boolean caseSensitive = true;\n  private final boolean trimTokens = false;\n  private final Map<String, String[]> tokenizedPatternCache = new ConcurrentHashMap<>(256);\n  private final String pathSeparator;\n  private volatile Boolean cachePatterns;\n\n  public AntPathMatcher() {\n    this.pathSeparator = DEFAULT_PATH_SEPARATOR;\n  }\n\n  public AntPathMatcher(String pathSeparator) {\n    this.pathSeparator = pathSeparator;\n  }\n\n  public static String[] tokenizeToStringArray(\n      String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) {\n\n    if (str == null) {\n      return EMPTY_STRING_ARRAY;\n    }\n\n    StringTokenizer st = new StringTokenizer(str, delimiters);\n    List<String> tokens = new ArrayList<>();\n    while (st.hasMoreTokens()) {\n      String token = st.nextToken();\n      if (trimTokens) {\n        token = token.trim();\n      }\n      if (!ignoreEmptyTokens || !token.isEmpty()) {\n        tokens.add(token);\n      }\n    }\n    return toStringArray(tokens);\n  }\n\n  public static String[] toStringArray(Collection<String> collection) {\n    return (!isEmpty(collection) ? collection.toArray(EMPTY_STRING_ARRAY) : EMPTY_STRING_ARRAY);\n  }\n\n  public static boolean isEmpty(Collection<?> collection) {\n    return (collection == null || collection.isEmpty());\n  }\n\n  private void deactivatePatternCache() {\n    this.cachePatterns = false;\n    this.tokenizedPatternCache.clear();\n    this.stringMatcherCache.clear();\n  }\n\n  public boolean match(String pattern, String path) {\n    return doMatch(pattern, path, true);\n  }\n\n  protected boolean doMatch(String pattern, String path, boolean fullMatch) {\n\n    if (path == null ||\n        path.startsWith(this.pathSeparator) != pattern.startsWith(this.pathSeparator)) {\n      return false;\n    }\n\n    String[] patternDirs = tokenizePattern(pattern);\n    if (this.caseSensitive && !isPotentialMatch(path, patternDirs)) {\n      return false;\n    }\n\n    String[] pathDirs = tokenizePath(path);\n    int pattIdxStart = 0;\n    int pattIdxEnd = patternDirs.length - 1;\n    int pathIdxStart = 0;\n    int pathIdxEnd = pathDirs.length - 1;\n\n    while (pattIdxStart <= pattIdxEnd && pathIdxStart <= pathIdxEnd) {\n      String patternDir = patternDirs[pattIdxStart];\n      if (\"**\".equals(patternDir)) {\n        break;\n      }\n      if (!matchStrings(patternDir, pathDirs[pathIdxStart])) {\n        return false;\n      }\n      pattIdxStart++;\n      pathIdxStart++;\n    }\n\n    if (pathIdxStart > pathIdxEnd) {\n      if (pattIdxStart > pattIdxEnd) {\n        return (pattern.endsWith(this.pathSeparator) == path.endsWith(this.pathSeparator));\n      }\n      if (!fullMatch) {\n        return true;\n      }\n      if (pattIdxStart == pattIdxEnd && patternDirs[pattIdxStart].equals(\"*\") &&\n          path.endsWith(this.pathSeparator)) {\n        return true;\n      }\n      for (int i = pattIdxStart; i <= pattIdxEnd; i++) {\n        if (!patternDirs[i].equals(\"**\")) {\n          return false;\n        }\n      }\n      return true;\n    } else if (pattIdxStart > pattIdxEnd) {\n      return false;\n    } else if (!fullMatch && \"**\".equals(patternDirs[pattIdxStart])) {\n      return true;\n    }\n\n    while (pattIdxStart <= pattIdxEnd && pathIdxStart <= pathIdxEnd) {\n      String patternDir = patternDirs[pattIdxEnd];\n      if (patternDir.equals(\"**\")) {\n        break;\n      }\n      if (!matchStrings(patternDir, pathDirs[pathIdxEnd])) {\n        return false;\n      }\n      if (pattIdxEnd == (patternDirs.length - 1)\n          && pattern.endsWith(this.pathSeparator) != path.endsWith(this.pathSeparator)) {\n        return false;\n      }\n      pattIdxEnd--;\n      pathIdxEnd--;\n    }\n    if (pathIdxStart > pathIdxEnd) {\n      for (int i = pattIdxStart; i <= pattIdxEnd; i++) {\n        if (!patternDirs[i].equals(\"**\")) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    while (pattIdxStart != pattIdxEnd && pathIdxStart <= pathIdxEnd) {\n      int patIdxTmp = -1;\n      for (int i = pattIdxStart + 1; i <= pattIdxEnd; i++) {\n        if (patternDirs[i].equals(\"**\")) {\n          patIdxTmp = i;\n          break;\n        }\n      }\n      if (patIdxTmp == pattIdxStart + 1) {\n        pattIdxStart++;\n        continue;\n      }\n      int patLength = (patIdxTmp - pattIdxStart - 1);\n      int strLength = (pathIdxEnd - pathIdxStart + 1);\n      int foundIdx = -1;\n\n      strLoop:\n      for (int i = 0; i <= strLength - patLength; i++) {\n        for (int j = 0; j < patLength; j++) {\n          String subPat = patternDirs[pattIdxStart + j + 1];\n          String subStr = pathDirs[pathIdxStart + i + j];\n          if (!matchStrings(subPat, subStr)) {\n            continue strLoop;\n          }\n        }\n        foundIdx = pathIdxStart + i;\n        break;\n      }\n\n      if (foundIdx == -1) {\n        return false;\n      }\n\n      pattIdxStart = patIdxTmp;\n      pathIdxStart = foundIdx + patLength;\n    }\n\n    for (int i = pattIdxStart; i <= pattIdxEnd; i++) {\n      if (!patternDirs[i].equals(\"**\")) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  private boolean isPotentialMatch(String path, String[] pattDirs) {\n    if (!this.trimTokens) {\n      int pos = 0;\n      for (String patternDir : pattDirs) {\n        int skipped = skipSeparator(path, pos, this.pathSeparator);\n        pos += skipped;\n        skipped = skipSegment(path, pos, patternDir);\n        if (skipped < patternDir.length()) {\n          return (skipped > 0 || (!patternDir.isEmpty() && isWildcardChar(patternDir.charAt(0))));\n        }\n        pos += skipped;\n      }\n    }\n    return true;\n  }\n\n  private int skipSegment(String path, int pos, String prefix) {\n    int skipped = 0;\n    for (int i = 0; i < prefix.length(); i++) {\n      char c = prefix.charAt(i);\n      if (isWildcardChar(c)) {\n        return skipped;\n      }\n      int currPos = pos + skipped;\n      if (currPos >= path.length()) {\n        return 0;\n      }\n      if (c == path.charAt(currPos)) {\n        skipped++;\n      }\n    }\n    return skipped;\n  }\n\n  private int skipSeparator(String path, int pos, String separator) {\n    int skipped = 0;\n    while (path.startsWith(separator, pos + skipped)) {\n      skipped += separator.length();\n    }\n    return skipped;\n  }\n\n  private boolean isWildcardChar(char c) {\n    for (char candidate : WILDCARD_CHARS) {\n      if (c == candidate) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  protected String[] tokenizePattern(String pattern) {\n    String[] tokenized = null;\n    Boolean cachePatterns = this.cachePatterns;\n    if (cachePatterns == null || cachePatterns) {\n      tokenized = this.tokenizedPatternCache.get(pattern);\n    }\n    if (tokenized == null) {\n      tokenized = tokenizePath(pattern);\n      if (cachePatterns == null && this.tokenizedPatternCache.size() >= CACHE_TURNOFF_THRESHOLD) {\n        deactivatePatternCache();\n        return tokenized;\n      }\n      if (cachePatterns == null || cachePatterns) {\n        this.tokenizedPatternCache.put(pattern, tokenized);\n      }\n    }\n    return tokenized;\n  }\n\n  protected String[] tokenizePath(String path) {\n    return tokenizeToStringArray(path, this.pathSeparator, this.trimTokens, true);\n  }\n\n  private boolean matchStrings(String pattern, String str) {\n    return getStringMatcher(pattern).matchStrings(str);\n  }\n\n  protected AntPathStringMatcher getStringMatcher(String pattern) {\n    AntPathStringMatcher matcher = null;\n    Boolean cachePatterns = this.cachePatterns;\n    if (cachePatterns == null || cachePatterns) {\n      matcher = this.stringMatcherCache.get(pattern);\n    }\n    if (matcher == null) {\n      matcher = new AntPathStringMatcher(pattern, this.caseSensitive);\n      if (cachePatterns == null && this.stringMatcherCache.size() >= CACHE_TURNOFF_THRESHOLD) {\n        deactivatePatternCache();\n        return matcher;\n      }\n      if (cachePatterns == null || cachePatterns) {\n        this.stringMatcherCache.put(pattern, matcher);\n      }\n    }\n    return matcher;\n  }\n\n  protected static class AntPathStringMatcher {\n\n    private static final Pattern GLOB_PATTERN =\n        Pattern.compile(\"\\\\?|\\\\*|\\\\{((?:\\\\{[^/]+?\\\\}|[^/{}]|\\\\\\\\[{}])+?)\\\\}\");\n\n    private static final String DEFAULT_VARIABLE_PATTERN = \"((?s).*)\";\n\n    private final String rawPattern;\n\n    private final boolean caseSensitive;\n\n    private final boolean exactMatch;\n\n    private final Pattern pattern;\n\n    public AntPathStringMatcher(String pattern, boolean caseSensitive) {\n      this.rawPattern = pattern;\n      this.caseSensitive = caseSensitive;\n      StringBuilder patternBuilder = new StringBuilder();\n      Matcher matcher = GLOB_PATTERN.matcher(pattern);\n      int end = 0;\n      while (matcher.find()) {\n        patternBuilder.append(quote(pattern, end, matcher.start()));\n        String match = matcher.group();\n        if (\"?\".equals(match)) {\n          patternBuilder.append('.');\n        } else if (\"*\".equals(match)) {\n          patternBuilder.append(\".*\");\n        } else if (match.startsWith(\"{\") && match.endsWith(\"}\")) {\n          int colonIdx = match.indexOf(':');\n          if (colonIdx == -1) {\n            patternBuilder.append(DEFAULT_VARIABLE_PATTERN);\n          } else {\n            String variablePattern = match.substring(colonIdx + 1, match.length() - 1);\n            patternBuilder.append('(');\n            patternBuilder.append(variablePattern);\n            patternBuilder.append(')');\n          }\n        }\n        end = matcher.end();\n      }\n      if (end == 0) {\n        this.exactMatch = true;\n        this.pattern = null;\n      } else {\n        this.exactMatch = false;\n        patternBuilder.append(quote(pattern, end, pattern.length()));\n        this.pattern = (this.caseSensitive ? Pattern.compile(patternBuilder.toString()) :\n            Pattern.compile(patternBuilder.toString(), Pattern.CASE_INSENSITIVE));\n      }\n    }\n\n    private String quote(String s, int start, int end) {\n      if (start == end) {\n        return \"\";\n      }\n      return Pattern.quote(s.substring(start, end));\n    }\n\n    public boolean matchStrings(String str) {\n      if (this.exactMatch) {\n        return this.caseSensitive ? this.rawPattern.equals(str) :\n            this.rawPattern.equalsIgnoreCase(str);\n      } else if (this.pattern != null) {\n        Matcher matcher = this.pattern.matcher(str);\n        return matcher.matches();\n      }\n      return false;\n    }\n\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/utils/ArrayUtils.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.utils;\n\nimport java.lang.reflect.Array;\n\npublic final class ArrayUtils {\n\n  public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];\n  public static final String[] EMPTY_STRING_ARRAY = new String[0];\n  public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];\n  public static final char[] EMPTY_CHAR_ARRAY = new char[0];\n  public static final short[] EMPTY_SHORT_ARRAY = new short[0];\n  public static final boolean[] EMPTY_BOOL_ARRAY = new boolean[0];\n  public static final int[] EMPTY_INT_ARRAY = new int[0];\n  public static final long[] EMPTY_LONG_ARRAY = new long[0];\n\n  private ArrayUtils() {\n  }\n\n  /**\n   * Join arrays provided as parameters, all arrays must be the same type, null values allowed.\n   *\n   * @param <T>    type of array\n   * @param arrays array of arrays to be joined\n   * @return all joined arrays as single array\n   * @since 1.0\n   */\n  @SafeVarargs\n  public static <T> T[] joinArrays(final T[]... arrays) {\n    int commonLength = 0;\n    for (final T[] array : arrays) {\n      if (array != null) {\n        commonLength += array.length;\n      }\n    }\n    @SuppressWarnings(\"unchecked\") final T[] result = (T[]) Array\n        .newInstance(arrays.getClass().getComponentType().getComponentType(), commonLength);\n    int position = 0;\n    for (final T[] array : arrays) {\n      if (array != null) {\n        System.arraycopy(array, 0, result, position, array.length);\n        position += array.length;\n      }\n    }\n    return result;\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/utils/GetUtils.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.utils;\n\nimport java.util.Objects;\n\npublic final class GetUtils {\n\n  private GetUtils() {\n  }\n\n  /**\n   * Get value and ensure that the value is not null\n   *\n   * @param <T>          type of value\n   * @param value        the value\n   * @param defaultValue the default value to be returned if the value is null\n   * @return not null value\n   * @throws AssertionError if both the value and the default value are null\n   * @since 1.0\n   */\n  public static <T> T ensureNonNull(final T value, final T defaultValue) {\n    return value == null ? Objects.requireNonNull(defaultValue) : value;\n  }\n\n  /**\n   * Ensure that a string will not be null.\n   *\n   * @param value value to be checked\n   * @return the value if it is not null or empty string if the value is null\n   * @since 1.1.1\n   */\n  public static String ensureNonNullStr(final String value) {\n    return value == null ? \"\" : value;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/utils/IOUtils.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.utils;\n\nimport java.io.Closeable;\n\npublic final class IOUtils {\n\n  private IOUtils() {\n  }\n\n  /**\n   * Closing quietly any closeable object. Any exception will be caught (but global error listeners will be notified)\n   *\n   * @param closeable object to be closed quetly\n   * @return the same object provided in args\n   */\n  public static Closeable closeQuietly(final Closeable closeable) {\n    if (closeable != null) {\n      try {\n        closeable.close();\n      } catch (Exception ex) {\n        // DO NOTHING\n      }\n    }\n    return closeable;\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/utils/PreprocessorUtils.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.utils;\n\nimport static com.igormaznitsa.jcp.context.CommentRemoverType.KEEP_ALL;\nimport static com.igormaznitsa.jcp.context.CommentRemoverType.REMOVE_C_STYLE;\nimport static com.igormaznitsa.jcp.context.CommentRemoverType.makeListOfAllRemoverIds;\n\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.containers.TextFileDataContainer;\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.CommentTextProcessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.context.SpecialVariableProcessor;\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Objects;\nimport java.util.Optional;\nimport java.util.ServiceLoader;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport org.apache.commons.io.FileUtils;\nimport org.apache.commons.io.FilenameUtils;\n\n/**\n * It is an auxiliary class contains some useful methods\n *\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic final class PreprocessorUtils {\n\n  /**\n   * Property if defined and true then search of services in class path is disabled.\n   *\n   * @since 7.2.0\n   */\n  public static final String SYSTEM_PROPERTY_DISABLE_SEARCH_SERVICES =\n      \"jcp.preprocessor.disable.search.services\";\n  private static final Pattern PATTERN_MACROS_WITH_SPACES =\n      Pattern.compile(\"\\\\/\\\\*\\\\s*\\\\$(.*?)\\\\$\\\\s*\\\\*\\\\/\");\n\n  private PreprocessorUtils() {\n  }\n\n  /**\n   * Find active FileInfoContainer in a context.\n   *\n   * @param context preprocessor context, must not be null\n   * @return found FileInfoContainer or empty optional\n   * @see FileInfoContainer\n   * @since 7.3.0\n   */\n  public static Optional<FileInfoContainer> findActiveFileInfoContainer(\n      final PreprocessorContext context\n  ) {\n    final Optional<FileInfoContainer> result = context.getPreprocessingState()\n        .getIncludeStack()\n        .stream()\n        .findFirst()\n        .map(TextFileDataContainer::getFile)\n        .flatMap(context::findFileInfoContainer);\n    return result.isPresent() ? result :\n        Optional.ofNullable(context.getPreprocessingState().getRootFileInfo());\n  }\n\n  /**\n   * Find current file position info in a context.\n   *\n   * @param context preprocessor context, must not be null\n   * @return found current file position info, must not be null\n   * @since 7.3.0\n   * @throws PreprocessorException thrown if it is impossible to find position info.\n   */\n  public static FilePositionInfo extractFilePositionInfo(\n      final PreprocessorContext context\n  ) {\n    return context.getPreprocessingState().findFilePositionInfo()\n        .orElseThrow(() -> context.makeException(\"Can't find position info in the context\", null));\n  }\n\n  /**\n   * Find all services in class path and register them in provided context.\n   *\n   * @param context target context must not be null\n   * @since 7.3.0\n   */\n  public static void fillContextByFoundServices(final PreprocessorContext context) {\n    final List<CommentTextProcessor> commentTextProcessors = findAndInstantiateAllServices(\n        CommentTextProcessor.class);\n    if (!commentTextProcessors.isEmpty()) {\n      context.getPreprocessorLogger()\n          .info(String.format(\"Detected %d comment text processing service(s): %s\",\n              commentTextProcessors.size(),\n              commentTextProcessors.stream().map(x -> x.getClass().getCanonicalName())\n                  .collect(Collectors.joining(\",\"))));\n      commentTextProcessors.forEach(context::addCommentTextProcessor);\n    }\n\n    final List<SpecialVariableProcessor> specialVariableProcessors = findAndInstantiateAllServices(\n        SpecialVariableProcessor.class);\n    if (!specialVariableProcessors.isEmpty()) {\n      context.getPreprocessorLogger()\n          .info(String.format(\"Detected %d special variable service(s): %s\",\n              specialVariableProcessors.size(),\n              specialVariableProcessors.stream().map(x -> x.getClass().getCanonicalName())\n                  .collect(Collectors.joining(\",\"))));\n      specialVariableProcessors.forEach(context::registerSpecialVariableProcessor);\n    }\n\n    final List<PreprocessorExtension> preprocessorExtensions = findAndInstantiateAllServices(\n        PreprocessorExtension.class);\n    if (!preprocessorExtensions.isEmpty()) {\n      context.getPreprocessorLogger()\n          .info(String.format(\"Detected %d preprocessor extension service(s): %s\",\n              preprocessorExtensions.size(),\n              preprocessorExtensions.stream().map(x -> x.getClass().getCanonicalName())\n                  .collect(Collectors.joining(\",\"))));\n      preprocessorExtensions.forEach(context::addPreprocessorExtension);\n    }\n  }\n\n  /**\n   * Find and instantiate a preprocessor extension for its class name. <b>Class must have default constructor.</b>\n   * The preprocessor extension will be called for action directives.\n   *\n   * @param className preprocessor extension class name, can be null.\n   * @return found and instantiated preprocessor extension or null if class name is null\n   * @throws RuntimeException with cause exception if any error during method call.\n   * @since 7.1.2\n   */\n  public static PreprocessorExtension findAndInstantiatePreprocessorExtensionForClassName(\n      final String className) {\n    if (className == null) {\n      return null;\n    }\n    try {\n      final Class<?> foundClass = Class.forName(className);\n      return (PreprocessorExtension) foundClass.getConstructor().newInstance();\n    } catch (Exception ex) {\n      throw new RuntimeException(\"Can't instantiate preprocessor extension class: \" + className,\n          ex);\n    }\n  }\n\n  /**\n   * Find comment remover type for provided identifier. Decoding also true and false values.\n   *\n   * @param text comment remover id as string, must not be null.\n   * @return found appropriate comment remover type, must not be null\n   * @since 7.1.0\n   */\n  public static CommentRemoverType findCommentRemoverForId(final String text) {\n    CommentRemoverType result = null;\n    if (text != null && !text.isEmpty()) {\n      final String normalized = text.trim().toUpperCase(Locale.ROOT);\n      if (normalized.equals(\"TRUE\")) {\n        result = KEEP_ALL;\n      } else if (normalized.equals(\"FALSE\")) {\n        result = REMOVE_C_STYLE;\n      } else {\n        for (final CommentRemoverType value : CommentRemoverType.values()) {\n          if (normalized.equals(value.name())) {\n            result = value;\n            break;\n          }\n        }\n      }\n    }\n    if (result == null) {\n      throw new IllegalArgumentException(\n          \"Can't recognize keep comment value '\" + text + \"' (allowed values: true,false,\" +\n              makeListOfAllRemoverIds() + ')');\n    }\n    return result;\n  }\n\n  public static String getFileExtension(final File file) {\n    String result = null;\n    if (file != null) {\n      result = FilenameUtils.getExtension(file.getName());\n    }\n    return result;\n  }\n\n  public static BufferedReader makeFileReader(final File file, final Charset charset,\n                                              final int bufferSize) throws IOException {\n    Objects.requireNonNull(file, \"File is null\");\n    Objects.requireNonNull(charset, \"Charset is null\");\n\n    BufferedReader result;\n\n    if (bufferSize <= 0) {\n      result = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset));\n    } else {\n      result =\n          new BufferedReader(new InputStreamReader(new FileInputStream(file), charset), bufferSize);\n    }\n\n    return result;\n  }\n\n  public static String[] replaceChar(final String[] source,\n                                     final char toBeReplaced, final char replacement) {\n    final String[] result = new String[source.length];\n    int index = 0;\n    for (final String curStr : source) {\n      result[index++] = curStr.replace(toBeReplaced, replacement);\n    }\n    return result;\n  }\n\n  public static String extractTrimmedTail(final String prefix, final String value) {\n    return extractTail(prefix, value).trim();\n  }\n\n  public static String extractTail(final String prefix, final String value) {\n    Objects.requireNonNull(prefix, \"Prefix is null\");\n    Objects.requireNonNull(value, \"Value is null\");\n\n    if (prefix.length() > value.length()) {\n      throw new IllegalArgumentException(\"Prefix is too long\");\n    }\n\n    return value.substring(prefix.length());\n  }\n\n  public static void copyFile(final File source, final File dest, final boolean copyFileAttributes)\n      throws IOException {\n    Objects.requireNonNull(source, \"Source is null\");\n    Objects.requireNonNull(dest, \"Destination file is null\");\n\n    if (source.isDirectory()) {\n      throw new IllegalArgumentException(\"Source file is directory\");\n    }\n\n    if (!dest.getParentFile().exists() && !dest.getParentFile().mkdirs()) {\n      throw new IOException(\"Can't make directory [\" + getFilePath(dest.getParentFile()) + ']');\n    }\n\n    FileUtils.copyFile(source, dest);\n    if (copyFileAttributes) {\n      copyFileAttributes(source, dest);\n    }\n  }\n\n  public static boolean copyFileAttributes(final File from, final File to) {\n    boolean result = to.setExecutable(from.canExecute());\n    result = result && to.setReadable(from.canRead());\n    result = result && to.setWritable(from.canWrite());\n    result = result && to.setLastModified(from.lastModified());\n    return result;\n  }\n\n  public static String replacePartByChar(final String text, final char chr, final int startPosition,\n                                         final int length) {\n    if (startPosition < 0) {\n      throw new IllegalArgumentException(\"Start position must be great or equal zero\");\n    }\n    if (length < 0) {\n      throw new IllegalArgumentException(\"Length must be great or equal zero\");\n    }\n\n    final StringBuilder result = new StringBuilder(text.length());\n\n    result.append(text.subSequence(0, Math.min(text.length(), startPosition)));\n    result.append(String.valueOf(chr)\n        .repeat(Math.max(0, Math.min(text.length(), startPosition + length) - startPosition)));\n    result.append(text.subSequence(Math.min(startPosition + length, text.length()), text.length()));\n\n    return result.toString();\n  }\n\n  public static <T> List<T> findAndInstantiateAllServices(final Class<T> serviceClass) {\n    if (Boolean.getBoolean(SYSTEM_PROPERTY_DISABLE_SEARCH_SERVICES)) {\n      return List.of();\n    }\n    final ServiceLoader<T> serviceLoader = ServiceLoader.load(serviceClass);\n    return serviceLoader.stream().map(ServiceLoader.Provider::get).collect(Collectors.toList());\n  }\n\n  public static String generateStringForChar(final char chr, final int length) {\n    final StringBuilder buffer = new StringBuilder(Math.max(length, 1));\n    buffer.append(String.valueOf(chr).repeat(Math.max(0, length)));\n    return buffer.toString();\n  }\n\n\n  public static String processMacroses(final String processingString,\n                                       final PreprocessorContext context) {\n    int position;\n    String result = processingString;\n\n    if (context.isAllowWhitespaces()) {\n      final Matcher matcher = PATTERN_MACROS_WITH_SPACES.matcher(processingString);\n      final StringBuilder buffer = new StringBuilder();\n      int end = 0;\n      while (matcher.find()) {\n        final int start = matcher.start();\n        final int prevEnd = end;\n        end = matcher.end();\n        final String macrosBody = matcher.group(1);\n        final Value value = Expression.evalExpression(macrosBody, context);\n        buffer.append(processingString, prevEnd, start);\n        buffer.append(value);\n      }\n      if (end < processingString.length()) {\n        buffer.append(processingString.substring(end));\n      }\n      result = buffer.toString();\n    } else {\n      while (!Thread.currentThread().isInterrupted()) {\n        position = result.indexOf(\"/*$\");\n\n        if (position >= 0) {\n          final String leftPart = result.substring(0, position);\n          final int beginIndex = position;\n          position = result.indexOf(\"$*/\", position);\n          if (position >= 0) {\n            final String macrosBody = result.substring(beginIndex + 3, position);\n            final String rightPart = result.substring(position + 3);\n\n            final Value value = Expression.evalExpression(macrosBody, context);\n\n            result = leftPart + value + rightPart;\n          } else {\n            break;\n          }\n        } else {\n          break;\n        }\n      }\n    }\n    return result;\n  }\n\n  private static void checkFile(final File file) throws IOException {\n    Objects.requireNonNull(file, \"File is null\");\n\n    if (!file.isFile()) {\n      throw new FileNotFoundException(\"File \" + getFilePath(file) + \" doesn't exist\");\n    }\n  }\n\n  public static String[] readWholeTextFileIntoArray(final File file, final Charset encoding,\n                                                    final AtomicBoolean endedByNextLine)\n      throws IOException {\n    checkFile(file);\n\n    final List<String> strContainer = new ArrayList<>(1024);\n    try (BufferedReader srcBufferedReader = PreprocessorUtils\n        .makeFileReader(file, encoding == null ? StandardCharsets.UTF_8 : encoding,\n            (int) file.length())) {\n      final StringBuilder buffer = new StringBuilder();\n\n      boolean stringEndedByNextLine = false;\n\n      boolean meetCR = false;\n\n      while (!Thread.currentThread().isInterrupted()) {\n        final int chr = srcBufferedReader.read();\n        if (chr < 0) {\n          break;\n        }\n\n        switch (chr) {\n          case '\\n': {\n            stringEndedByNextLine = true;\n            strContainer.add(buffer.toString());\n            buffer.setLength(0);\n            meetCR = false;\n          }\n          break;\n          case '\\r': {\n            if (meetCR) {\n              buffer.append((char) chr);\n            } else {\n              stringEndedByNextLine = false;\n              meetCR = true;\n            }\n          }\n          break;\n          default: {\n            if (meetCR) {\n              buffer.append('\\r');\n            }\n            meetCR = false;\n            stringEndedByNextLine = false;\n            buffer.append((char) chr);\n          }\n          break;\n        }\n      }\n\n      if (buffer.length() != 0) {\n        strContainer.add(buffer.toString());\n        buffer.setLength(0);\n      }\n\n      if (endedByNextLine != null) {\n        endedByNextLine.set(stringEndedByNextLine);\n      }\n    }\n\n    return strContainer.toArray(new String[0]);\n  }\n\n  public static String[] splitForEqualChar(final String string) {\n    final int index = string.indexOf('=');\n\n    final String[] result;\n    if (index < 0) {\n      result = new String[] {string};\n    } else {\n      final String leftPart = string.substring(0, index).trim();\n      final String rightPart = string.substring(index + 1).trim();\n      result = new String[] {leftPart, rightPart};\n    }\n    return result;\n  }\n\n\n  public static List<String> splitForCharAndHoldEmptyLine(final String string,\n                                                          final char delimiter) {\n    final List<String> result = splitForChar(string, delimiter);\n    if (result.isEmpty()) {\n      result.add(\"\");\n    }\n    return result;\n  }\n\n  public static List<String> splitForChar(final String string, final char delimiter) {\n    final char[] array = string.toCharArray();\n    final StringBuilder buffer =\n        new StringBuilder((array.length >> 1) == 0 ? 1 : array.length >> 1);\n\n    final List<String> tokens = new ArrayList<>(10);\n\n    for (final char curChar : array) {\n      if (curChar == delimiter) {\n        if (buffer.length() != 0) {\n          tokens.add(buffer.toString());\n          buffer.setLength(0);\n        }\n      } else {\n        buffer.append(curChar);\n      }\n    }\n\n    if (buffer.length() != 0) {\n      tokens.add(buffer.toString());\n    }\n\n    return tokens;\n  }\n\n\n  public static String normalizeVariableName(final String name) {\n    if (name == null) {\n      return null;\n    }\n\n    return name.trim().toLowerCase(Locale.ROOT);\n  }\n\n\n  public static String getFilePath(final File file) {\n    String result = \"\";\n    if (file != null) {\n      try {\n        result = file.getCanonicalPath();\n      } catch (IOException ex) {\n        result = file.getAbsolutePath();\n      }\n    }\n    return result;\n  }\n\n  public static void throwPreprocessorException(final String msg, final String processingString,\n                                                final File srcFile, final int nextStringIndex,\n                                                final Throwable cause) {\n    throw new PreprocessorException(msg, processingString,\n        new FilePositionInfo[] {new FilePositionInfo(srcFile, nextStringIndex)}, cause);\n  }\n\n  public static String[] replaceStringPrefix(\n      final String[] allowedPrefixesToBeReplaced, final String replacement,\n      final String[] strings) {\n    final String[] result = new String[strings.length];\n\n    for (int i = 0; i < strings.length; i++) {\n      final String str = strings[i];\n\n      String detectedPrefix = null;\n\n      for (final String prefix : allowedPrefixesToBeReplaced) {\n        if (str.startsWith(prefix) &&\n            (detectedPrefix == null || detectedPrefix.length() < prefix.length())) {\n          detectedPrefix = prefix;\n        }\n      }\n\n      if (detectedPrefix != null) {\n        result[i] = replacement + str.substring(detectedPrefix.length());\n      } else {\n        result[i] = str;\n      }\n    }\n\n    return result;\n  }\n\n\n  public static String getNextLineCodes() {\n    return System.getProperty(\"line.separator\", \"\\r\\n\");\n  }\n\n\n  public static String leftTrim(String rawString) {\n    int firstNonSpace = 0;\n    for (int i = 0; i < rawString.length(); i++) {\n      final char ch = rawString.charAt(i);\n      if (ch > 32) {\n        break;\n      }\n      firstNonSpace++;\n    }\n    return rawString.substring(firstNonSpace);\n  }\n\n  public static boolean isFileContentEquals(final File src, final File dst) throws IOException {\n    if (src == null && dst == null) {\n      return true;\n    }\n    if (src == null || dst == null) {\n      return false;\n    }\n    if (src.isDirectory() && dst.isDirectory()) {\n      return true;\n    }\n    if (src.isDirectory() || dst.isDirectory()) {\n      return false;\n    }\n\n    if (src.length() != dst.length()) {\n      return false;\n    }\n    return FileUtils.contentEquals(src, dst);\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/java/com/igormaznitsa/jcp/utils/ResettablePrinter.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.utils;\n\nimport java.io.CharArrayWriter;\nimport java.io.IOException;\nimport java.io.Writer;\n\n/**\n * Text printer to keep text in internal buffer.\n *\n * @since 7.3.0\n */\npublic class ResettablePrinter {\n\n  private final CharArrayWriter internalBuffer;\n\n  public ResettablePrinter(final int initialCapacity) {\n    this.internalBuffer = new CharArrayWriter(initialCapacity);\n  }\n\n  public String getText() {\n    return new String(this.internalBuffer.toCharArray());\n  }\n\n  public boolean isEmpty() {\n    return internalBuffer.size() == 0;\n  }\n\n  public void writeBufferTo(final Writer writer) throws IOException {\n    this.internalBuffer.flush();\n    writer.write(internalBuffer.toCharArray());\n    writer.flush();\n  }\n\n  public int getSize() {\n    return internalBuffer.size();\n  }\n\n  public void reset() {\n    internalBuffer.reset();\n  }\n\n  public void print(final String text) {\n    for (final char chr : text.toCharArray()) {\n      internalBuffer.write(chr);\n    }\n  }\n\n  public void println(final String text, final String eol) {\n    for (final char chr : text.toCharArray()) {\n      this.internalBuffer.write(chr);\n    }\n    internalBuffer.write(eol, 0, eol.length());\n  }\n}\n"
  },
  {
    "path": "jcp/src/main/resources/META-INF/gradle-plugins/com.igormaznitsa.jcp.properties",
    "content": "implementation-class=com.igormaznitsa.jcp.gradle.JcpGradlePlugin"
  },
  {
    "path": "jcp/src/main/resources/com/igormaznitsa/jcp/ant/antlib.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<antlib>\n    <taskdef name=\"preprocess\" classname=\"com.igormaznitsa.jcp.ant.PreprocessTask\"/>\n</antlib>\n"
  },
  {
    "path": "jcp/src/main/resources/com/igormaznitsa/jcp/ant/tasks.properties",
    "content": "preprocess=com.igormaznitsa.jcp.ant.PreprocessTask"
  },
  {
    "path": "jcp/src/main/resources/jcpversion.properties",
    "content": "version=${project.version}\nurl=${project.url}\nyear=${current.year}\n"
  },
  {
    "path": "jcp/src/site/markdown/examples/hello-world.md",
    "content": "# Hello World\n\nJust add the snippet into pom.xml\n\n```xml\n\n<build>\n    <plugins>\n        <plugin>\n            <groupId>com.igormaznitsa</groupId>\n            <artifactId>jcp</artifactId>\n            <version>7.3.0</version>\n            <executions>\n                <execution>\n                    <id>preprocessSources</id>\n                    <phase>generate-sources</phase>\n                    <goals>\n                        <goal>preprocess</goal>\n                    </goals>\n                </execution>\n            </executions>\n        </plugin>\n    </plugins>\n</build>    \n```\n\nThen build project with `mvn clean install` and check the folder `target/generated-sources/preprocessed`"
  },
  {
    "path": "jcp/src/site/markdown/index.md",
    "content": "# Java Comment Preprocessor\n\nJava Comment Preprocessor (JCP) is a Maven plugin that allows preprocessing of source code for languages that support\nC-style comments. It stores its directives inside comments and supports some automation features, such as loops and file\nloading/processing. JCP was originally created for developing mobile J2ME games, but later evolved into a full-featured\ntool.\n\nJust add code-snippet below into build section and the plugin will be started during build.\n\n```xml\n\n<build>\n    <plugins>\n        <plugin>\n            <groupId>com.igormaznitsa</groupId>\n            <artifactId>jcp</artifactId>\n            <version>7.3.0</version>\n            <executions>\n                <execution>\n                    <id>preprocess-sources</id>\n                    <phase>generate-sources</phase>\n                    <goals>\n                        <goal>preprocess</goal>\n                    </goals>\n                </execution>\n            </executions>\n        </plugin>\n    </plugins>\n</build>    \n```\n"
  },
  {
    "path": "jcp/src/site/markdown/usage.md",
    "content": "# Usage\n\nJust add the plugin into the module build section.\n\n```xml\n\n<plugin>\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>gosdk-wrapper-maven-plugin</artifactId>\n    <version>1.0.5</version>\n    <configuration>\n        <goVersion>1.24.4</goVersion>\n    </configuration>\n    <executions>\n        <execution>\n            <id>go-help</id>\n            <goals>\n                <goal>execute</goal>\n            </goals>\n            <configuration>\n                <args>\n                    <arg>help</arg>\n                </args>\n            </configuration>\n        </execution>\n    </executions>\n</plugin>\n```\n\nIf you use `jar` packaging then you should deactivate default plugin calls. You can disable\nthem with below code snippet.\n\n```xml\n\n<plugin>\n    <artifactId>maven-clean-plugin</artifactId>\n    <executions>\n        <execution>\n            <id>default-clean</id>\n            <phase>none</phase>\n        </execution>\n    </executions>\n</plugin>\n<plugin>\n<artifactId>maven-jar-plugin</artifactId>\n<executions>\n    <execution>\n        <id>default-jar</id>\n        <phase>none</phase>\n    </execution>\n</executions>\n</plugin>\n<plugin>\n<artifactId>maven-surefire-plugin</artifactId>\n<executions>\n    <execution>\n        <id>default-test</id>\n        <phase>none</phase>\n    </execution>\n</executions>\n</plugin>\n<plugin>\n<artifactId>maven-compiler-plugin</artifactId>\n<executions>\n    <execution>\n        <id>default-compile</id>\n        <phase>none</phase>\n    </execution>\n    <execution>\n        <id>default-testCompile</id>\n        <phase>none</phase>\n    </execution>\n</executions>\n</plugin>\n<plugin>\n<artifactId>maven-install-plugin</artifactId>\n<executions>\n    <execution>\n        <id>default-install</id>\n        <phase>none</phase>\n    </execution>\n</executions>\n</plugin>\n```\n"
  },
  {
    "path": "jcp/src/site/site.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project>\n    <skin>\n        <groupId>org.apache.maven.skins</groupId>\n        <artifactId>maven-fluido-skin</artifactId>\n        <version>2.0.1</version>\n    </skin>\n    <body>\n        <menu name=\"Overview\">\n            <item name=\"Introduction\" href=\"index.html\"/>\n            <item name=\"Goals\" href=\"plugin-info.html\"/>\n            <item name=\"Usage\" href=\"usage.html\"/>\n            <!--            <item name=\"FAQ\" href=\"faq.html\"/>-->\n        </menu>\n        <menu name=\"Examples\">\n            <item name=\"Hello World\" href=\"examples/hello-world.html\"/>\n        </menu>\n    </body>\n</project>"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/AbstractMockPreprocessorContextTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.powermock.api.mockito.PowerMockito.doAnswer;\nimport static org.powermock.api.mockito.PowerMockito.doThrow;\nimport static org.powermock.api.mockito.PowerMockito.mock;\nimport static org.powermock.api.mockito.PowerMockito.when;\n\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.utils.ResettablePrinter;\nimport java.io.File;\nimport java.util.concurrent.atomic.AtomicReference;\nimport org.junit.runner.RunWith;\nimport org.powermock.core.classloader.annotations.PrepareForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\n@RunWith(PowerMockRunner.class)\n@PrepareForTest({PreprocessorContext.class, PreprocessingState.class})\npublic abstract class AbstractMockPreprocessorContextTest {\n\n  protected PreprocessorContext prepareMockContext() throws Exception {\n    final PreprocessorContext preparedContext = mock(PreprocessorContext.class);\n    final PreprocessingState preparedState = mock(PreprocessingState.class);\n\n    final AtomicReference<CommentRemoverType> keepComments = new AtomicReference<>(\n        CommentRemoverType.REMOVE_C_STYLE);\n\n    doThrow(new PreprocessorException(\"mock_msg\", \"\", new FilePositionInfo[0], null))\n        .when(preparedContext)\n        .makeException(any(String.class), any());\n\n    final FileInfoContainer container = new FileInfoContainer(\n        new File(\"src/fake.java\"),\n        \"fake.java\",\n        false\n    );\n\n    when(preparedContext.getKeepComments()).thenAnswer(\n        invocationOnMock -> keepComments.get());\n\n    doAnswer(invocationOnMock -> {\n      keepComments.set((CommentRemoverType) invocationOnMock.getArguments()[0]);\n      return null;\n    }).when(preparedContext).setKeepComments(any(CommentRemoverType.class));\n\n    when(preparedState.getRootFileInfo()).thenReturn(container);\n\n    final ResettablePrinter printer = new ResettablePrinter(10);\n    when(preparedState.getSelectedPrinter()).thenReturn(printer);\n    when(preparedContext.getPreprocessingState()).thenReturn(preparedState);\n\n    return preparedContext;\n  }\n\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/AbstractSpyPreprocessorContextTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp;\n\nimport static org.apache.commons.io.FilenameUtils.normalize;\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.io.File;\nimport java.util.Collections;\nimport java.util.List;\nimport org.apache.commons.io.FileUtils;\nimport org.apache.commons.io.FilenameUtils;\nimport org.junit.AfterClass;\nimport org.junit.Before;\nimport org.junit.BeforeClass;\nimport org.junit.rules.TemporaryFolder;\nimport org.junit.runner.RunWith;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\n@RunWith(PowerMockRunner.class)\n@PrepareForTest({PreprocessorContext.class, PreprocessingState.class})\npublic abstract class AbstractSpyPreprocessorContextTest {\n\n  protected static TemporaryFolder destinationFolder;\n\n  @BeforeClass\n  public static void prepareClassTests() throws Exception {\n    destinationFolder = new TemporaryFolder(new File(\"./\"));\n    destinationFolder.create();\n  }\n\n  @AfterClass\n  public static void doJanitor() throws Exception {\n    destinationFolder.delete();\n  }\n\n  @Before\n  public void beforeTest() throws Exception {\n    FileUtils.cleanDirectory(destinationFolder.getRoot());\n  }\n\n  protected List<String> getCurrentTestFolder() {\n    final String testFolder =\n        FilenameUtils.normalizeNoEndSeparator(System.getProperty(\"test.folder\"));\n    final String fullClassPath = this.getClass().getName().replace('.', File.separatorChar);\n    return Collections.singletonList(normalize(testFolder + File.separator +\n        fullClassPath.substring(0, fullClassPath.lastIndexOf(File.separatorChar))));\n  }\n\n  protected File getDestinationFolder() {\n    return destinationFolder.getRoot();\n  }\n\n  protected void assertDestinationFolderEmpty() throws Exception {\n    assertEquals(\"Destination folder must be enpty\", 0, destinationFolder.getRoot().list().length);\n  }\n\n  protected PreprocessorContext preparePreprocessorContext(final List<String> sourceFolders)\n      throws Exception {\n    return this.preparePreprocessorContext(sourceFolders, () -> false);\n  }\n\n  protected PreprocessorContext preparePreprocessorContext(final List<String> sourceFolders,\n                                                           final ContextDataProvider provider)\n      throws Exception {\n    final PreprocessorContext spyContext =\n        PowerMockito.spy(new PreprocessorContext(new File(\"some_impossible_folder_121212\")));\n    final PreprocessingState fakeState = PreprocessingState.makeMock(spyContext);\n    PowerMockito.when(spyContext.getPreprocessingState()).thenReturn(fakeState);\n\n    spyContext.setAllowWhitespaces(provider.getAllowSpaceBeforeDirectiveFlag());\n    spyContext.setSources(sourceFolders);\n    spyContext.setTarget(destinationFolder.getRoot());\n\n    return spyContext;\n  }\n\n  public interface ContextDataProvider {\n    boolean getAllowSpaceBeforeDirectiveFlag();\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/JCPreprocessorTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.cmdline.CommandLineHandler;\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.InputStreamReader;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport org.junit.Test;\n\npublic final class JCPreprocessorTest {\n\n  private void assertGVDFPreprocessorException(final String file,\n                                               final int stringIndexStartedFromOne)\n      throws Exception {\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    context.registerConfigFile(new File(this.getClass().getResource(file).toURI()));\n    final JcpPreprocessor preprocessor = new JcpPreprocessor(context);\n    try {\n      preprocessor.processConfigFiles();\n      fail(\"Must throw a PreprocessorException\");\n    } catch (PreprocessorException expected) {\n      if (stringIndexStartedFromOne != expected.getLineNumber()) {\n        fail(\"Wrong error string index [\" + expected.toString() + ']');\n      }\n    }\n  }\n\n  @Test\n  public void testProcessGlobalVarDefiningFiles() throws Exception {\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    context.registerConfigFile(new File(this.getClass().getResource(\"./global_ok.txt\").toURI()));\n    final JcpPreprocessor preprocessor = new JcpPreprocessor(context);\n    preprocessor.processConfigFiles();\n\n    assertEquals(\"Must have the variable\", \"hello world\",\n        context.findVariableForName(\"globalVar1\", true).asString());\n    assertEquals(\"Must have the variable\", Value.INT_THREE,\n        context.findVariableForName(\"globalVar2\", true));\n    assertEquals(\"Character input encoding must be changed\", StandardCharsets.ISO_8859_1,\n        context.getSourceEncoding());\n  }\n\n  @Test\n  public void testProcessGlobalVarDefiningFiles_ATsymbol() throws Exception {\n    assertGVDFPreprocessorException(\"global_error_at.txt\", 8);\n  }\n\n  @Test\n  public void testJavaCommentRemoving() throws Exception {\n\n    final File testDirectory = new File(getClass().getResource(\"removers/java\").toURI());\n    final File resultFile = new File(testDirectory, \"w_o_comments.ttt\");\n    final File etalonFile = new File(testDirectory, \"etalon.etl\");\n\n    if (resultFile.exists()) {\n      assertTrue(\"We have to remove the existing result file\", resultFile.delete());\n    }\n\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    context.setSources(Collections.singletonList(testDirectory.getCanonicalPath()));\n    context.setTarget(testDirectory);\n    context.setClearTarget(false);\n    context.setKeepComments(CommentRemoverType.REMOVE_C_STYLE);\n    context.setExtensions(Collections.singletonList(\"ppp\"));\n    context.setExcludeExtensions(Collections.singletonList(\"etl\"));\n\n    final JcpPreprocessor preprocessor = new JcpPreprocessor(context);\n    preprocessor.execute();\n\n    assertTrue(\"There must be the result file\", resultFile.exists());\n    assertTrue(\"There must be the etalon file\", etalonFile.exists());\n\n    String differentLine = null;\n    int lineIndex = 1;\n    try (BufferedReader resultReader = new BufferedReader(\n        new InputStreamReader(new FileInputStream(resultFile), StandardCharsets.UTF_8))) {\n      try (BufferedReader etalonReader = new BufferedReader(\n          new InputStreamReader(new FileInputStream(etalonFile),\n              StandardCharsets.UTF_8))) {\n\n        while (!Thread.currentThread().isInterrupted()) {\n          final String resultStr = resultReader.readLine();\n          final String etalonStr = etalonReader.readLine();\n          if (resultStr == null && etalonStr == null) {\n            break;\n          }\n\n          if (resultStr == null || !resultStr.equals(etalonStr)) {\n            differentLine = resultStr;\n            break;\n          }\n\n          lineIndex++;\n        }\n      }\n    }\n\n    if (differentLine != null) {\n      fail(\"Line \" + lineIndex + \" There is a different strings [\" + differentLine + '[');\n    }\n  }\n\n  @Test\n  public void testCLIHandlerNameConflicts() {\n    final List<String> checked = new ArrayList<>();\n    for (final CommandLineHandler h : JcpPreprocessor.COMMAND_LINE_HANDLERS) {\n      final String name = h.getKeyName();\n      for (final String l : checked) {\n        if (l.startsWith(name) || name.startsWith(l)) {\n          fail(\"Conflict [\" + l + \" and \" + name + ']');\n        }\n      }\n      checked.add(name);\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/TestUtils.java",
    "content": "/*\n * Copyright 2019 Igor Maznitsa.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.igormaznitsa.jcp;\n\nimport java.io.File;\nimport java.nio.file.Path;\nimport org.junit.Assert;\n\npublic final class TestUtils {\n  private TestUtils() {\n  }\n\n\n  public static String normalizeNextLine(final String text) {\n    return text == null ? null : text.replace(\"\\r\\n\", \"\\n\");\n  }\n\n  public static void assertFilePath(final String message, final File expected, final File check) {\n    final Path pathExpected = expected.toPath().normalize();\n    final Path pathCheck = check.toPath().normalize();\n    if (!pathExpected.equals(pathCheck)) {\n      Assert.fail(\"Expected path '\" + pathExpected.toString() + \"' but detected path '\" +\n          pathCheck.toString() + \"'\");\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/ant/PreprocessTaskTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.ant;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\n\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport java.io.File;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Hashtable;\nimport java.util.List;\nimport java.util.Set;\nimport org.apache.tools.ant.Project;\nimport org.junit.Before;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class PreprocessTaskTest {\n\n  final static Project projectMock = mock(Project.class);\n  static File THIS_DIRECTORY;\n\n  static {\n    when(projectMock.getBaseDir()).thenReturn(new File(\"base/dir\"));\n    when(projectMock.getProperties()).thenReturn(new Hashtable<String, Object>());\n  }\n\n  PreprocessTask antTask;\n\n  @BeforeClass\n  public static void beforeClass() throws Exception {\n    THIS_DIRECTORY =\n        new File(com.igormaznitsa.jcp.ant.PreprocessTaskTest.class.getResource(\"./\").toURI());\n  }\n\n  @Before\n  public void beforeTest() {\n    antTask = new PreprocessTask();\n    antTask.setProject(projectMock);\n\n    final PreprocessTask.Sources sources = new PreprocessTask.Sources();\n    sources.createPath().setValue(THIS_DIRECTORY.getAbsolutePath());\n\n    antTask.setSources(sources);\n  }\n\n  @Test\n  public void testSetSources() {\n    final List<PreprocessorContext.SourceFolder> sourceDirs =\n        antTask.makePreprocessorContext().getSources();\n    assertEquals(1, sourceDirs.size());\n    assertEquals(THIS_DIRECTORY, sourceDirs.get(0).getAsFile());\n  }\n\n  @Test\n  public void testTarget() {\n    antTask.setTarget(THIS_DIRECTORY.getAbsolutePath());\n    assertEquals(THIS_DIRECTORY, antTask.makePreprocessorContext().getTarget());\n  }\n\n  @Test\n  public void testSourceEncoding() {\n    final String TEST = \"ISO-8859-1\";\n    antTask.setSourceEncoding(TEST);\n    assertEquals(StandardCharsets.ISO_8859_1,\n        antTask.makePreprocessorContext().getSourceEncoding());\n  }\n\n  @Test\n  public void testTargetEncoding() {\n    final String TEST = \"ISO-8859-1\";\n    antTask.setTargetEncoding(TEST);\n    assertEquals(StandardCharsets.ISO_8859_1,\n        antTask.makePreprocessorContext().getTargetEncoding());\n  }\n\n  @Test\n  public void testExcludedExtensions() {\n    final PreprocessTask.ExcludeExtensions antextensions = antTask.createExcludeExtensions();\n    antextensions.createExtension().addText(\"bin\");\n    antextensions.createExtension().addText(\"vb\");\n    antextensions.createExtension().addText(\"cpp\");\n    final Set<String> extensions = antTask.makePreprocessorContext().getExcludeExtensions();\n    assertEquals(3, extensions.size());\n    assertTrue(extensions.contains(\"bin\"));\n    assertTrue(extensions.contains(\"vb\"));\n    assertTrue(extensions.contains(\"cpp\"));\n  }\n\n  @Test\n  public void testExtensions() {\n    final PreprocessTask.Extensions antextensions = antTask.createExtensions();\n    antextensions.createExtension().addText(\"bin\");\n    antextensions.createExtension().addText(\"vb\");\n    antextensions.createExtension().addText(\"cpp\");\n    final Set<String> extensions = antTask.makePreprocessorContext().getExtensions();\n    assertEquals(3, extensions.size());\n    assertTrue(extensions.contains(\"bin\"));\n    assertTrue(extensions.contains(\"vb\"));\n    assertTrue(extensions.contains(\"cpp\"));\n  }\n\n\n  @Test\n  public void testClearTarget() {\n    antTask.setClearTarget(true);\n    assertTrue(antTask.makePreprocessorContext().isClearTarget());\n    antTask.setClearTarget(false);\n    assertFalse(antTask.makePreprocessorContext().isClearTarget());\n  }\n\n  @Test\n  public void testKeepComments() throws Exception {\n    antTask.setKeepComments(\"true\");\n    assertEquals(CommentRemoverType.KEEP_ALL, antTask.makePreprocessorContext().getKeepComments());\n    antTask.setKeepComments(\"false\");\n    assertEquals(CommentRemoverType.REMOVE_C_STYLE,\n        antTask.makePreprocessorContext().getKeepComments());\n  }\n\n  @Test\n  public void testVerbose() throws Exception {\n    antTask.setVerbose(true);\n    assertTrue(antTask.makePreprocessorContext().isVerbose());\n    antTask.setVerbose(false);\n    assertFalse(antTask.makePreprocessorContext().isVerbose());\n  }\n\n  @Test\n  public void testAllowWhitespace() {\n    antTask.setAllowWhitespaces(true);\n    assertTrue(antTask.makePreprocessorContext().isAllowWhitespaces());\n    antTask.setAllowWhitespaces(false);\n    assertFalse(antTask.makePreprocessorContext().isVerbose());\n  }\n\n  @Test\n  public void testCareForLastEol() {\n    antTask.setCareForLastEol(true);\n    assertTrue(antTask.makePreprocessorContext().isCareForLastEol());\n    antTask.setCareForLastEol(false);\n    assertFalse(antTask.makePreprocessorContext().isCareForLastEol());\n  }\n\n  @Test\n  public void testEol() {\n    antTask.setEol(\"someeol\\\\r\\\\n\");\n    assertEquals(\"someeol\\r\\n\", antTask.makePreprocessorContext().getEol());\n  }\n\n  @Test\n  public void testPreserveIndents() {\n    antTask.setPreserveIndents(true);\n    assertTrue(antTask.makePreprocessorContext().isPreserveIndents());\n    antTask.setPreserveIndents(false);\n    assertFalse(antTask.makePreprocessorContext().isPreserveIndents());\n  }\n\n  @Test\n  public void testDontOverwriteSameContent() {\n    antTask.setDontOverwriteSameContent(true);\n    assertTrue(antTask.makePreprocessorContext().isDontOverwriteSameContent());\n    antTask.setDontOverwriteSameContent(false);\n    assertFalse(antTask.makePreprocessorContext().isDontOverwriteSameContent());\n  }\n\n  @Test\n  public void testDryRun() {\n    antTask.setDryRun(true);\n    assertTrue(antTask.makePreprocessorContext().isDryRun());\n    antTask.setDryRun(false);\n    assertFalse(antTask.makePreprocessorContext().isDryRun());\n  }\n\n  @Test\n  public void testUnknownVarAsFalse() {\n    antTask.setUnknownVarAsFalse(true);\n    assertTrue(antTask.makePreprocessorContext().isUnknownVariableAsFalse());\n    antTask.setUnknownVarAsFalse(false);\n    assertFalse(antTask.makePreprocessorContext().isUnknownVariableAsFalse());\n  }\n\n  @Test\n  public void testAddGlobal() {\n    final PreprocessTask.Vars vars = antTask.createVars();\n    final PreprocessTask.Vars.Var var = vars.createVar();\n    var.setName(\"hello_world\");\n    var.setValue(\"4\");\n    assertEquals(Value.INT_FOUR,\n        antTask.makePreprocessorContext().findVariableForName(\"hello_world\", false));\n  }\n\n  @Test\n  public void testAddCfgFile() {\n    final PreprocessTask.ConfigFiles configFiles = antTask.createConfigFiles();\n    configFiles.createPath().setValue(\"what/that\");\n    configFiles.createPath().setValue(\"what/those\");\n\n    final List<File> foundConfigFiles = antTask.makePreprocessorContext().getConfigFiles();\n    assertEquals(\"Must be 2\", 2, foundConfigFiles.size());\n    assertEquals(\"base/dir/what/that\".replace('/', File.separatorChar),\n        foundConfigFiles.get(0).getPath());\n    assertEquals(\"base/dir/what/those\".replace('/', File.separatorChar),\n        foundConfigFiles.get(1).getPath());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/AbstractCommandLineHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.AbstractMockPreprocessorContextTest;\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport org.junit.Test;\n\npublic abstract class AbstractCommandLineHandlerTest extends AbstractMockPreprocessorContextTest {\n\n  @Test\n  public abstract void testExecution() throws Exception;\n\n  @Test\n  public abstract void testName();\n\n  @Test\n  public abstract void testDescription();\n\n  @Test\n  public abstract void testThatTheHandlerInTheHandlerList();\n\n  protected void assertDescription(final CommandLineHandler handler) {\n    assertNotNull(\"Reference must not be null\", handler.getDescription());\n    assertFalse(\"Reference must not be empty one\", handler.getDescription().isEmpty());\n    assertTrue(\"Reference length must be great than 10 chars\",\n        handler.getDescription().length() > 10);\n  }\n\n  protected void assertHandlerInTheHandlerList(final CommandLineHandler handler) {\n    for (final CommandLineHandler h : JcpPreprocessor.getCommandLineHandlers()) {\n      if (handler.getClass() == h.getClass()) {\n        return;\n      }\n    }\n    fail(\"There is not the handler in the common command line handler list\");\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/ActionPreprocessorExtensionHandlerTest.java",
    "content": "package com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.ArgumentMatchers.anyBoolean;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.reset;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport org.junit.Test;\n\npublic class ActionPreprocessorExtensionHandlerTest extends AbstractCommandLineHandlerTest {\n  private static final ActionPreprocessorExtensionHandler HANDLER =\n      new ActionPreprocessorExtensionHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Test\n  public void testErrorWithoutFlag() {\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertTrue(HANDLER.processCommandLineKey(\"/EA:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/AE\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/E \", mock));\n    verify(mock, never()).setAllowWhitespaces(anyBoolean());\n\n    assertFalse(HANDLER.processCommandLineKey(\"/EA\", mock));\n    reset(mock);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/EA:\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n\n}"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/AllowMergeBlockLineHandlerTest.java",
    "content": "package com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class AllowMergeBlockLineHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final AllowMergeBlockLineHandler HANDLER = new AllowMergeBlockLineHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/b:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/BB\", mock));\n\n    assertTrue(HANDLER.processCommandLineKey(\"/B\", mock));\n    verify(mock).setAllowsBlocks(true);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/B\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n\n}"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/AllowWhitespaceDirectiveHandlerTest.java",
    "content": "/*\r\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\r\n *\r\n * Licensed to the Apache Software Foundation (ASF) under one\r\n * or more contributor license agreements.  See the NOTICE file\r\n * distributed with this work for additional information\r\n * regarding copyright ownership.  The ASF licenses this file\r\n * to you under the Apache License, Version 2.0 (the\r\n * \"License\"); you may not use this file except in compliance\r\n * with the License.  You may obtain a copy of the License at\r\n *\r\n *   http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing,\r\n * software distributed under the License is distributed on an\r\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n * KIND, either express or implied.  See the License for the\r\n * specific language governing permissions and limitations\r\n * under the License.\r\n */\r\n\r\npackage com.igormaznitsa.jcp.cmdline;\r\n\r\nimport static org.junit.Assert.assertEquals;\r\nimport static org.junit.Assert.assertFalse;\r\nimport static org.junit.Assert.assertTrue;\r\nimport static org.mockito.Mockito.anyBoolean;\r\nimport static org.mockito.Mockito.never;\r\nimport static org.mockito.Mockito.reset;\r\nimport static org.mockito.Mockito.verify;\r\n\r\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\r\nimport org.junit.Test;\r\n\r\npublic class AllowWhitespaceDirectiveHandlerTest extends AbstractCommandLineHandlerTest {\r\n\r\n  private static final AllowWhitespaceDirectiveHandler HANDLER =\r\n      new AllowWhitespaceDirectiveHandler();\r\n\r\n  @Override\r\n  public void testThatTheHandlerInTheHandlerList() {\r\n    assertHandlerInTheHandlerList(HANDLER);\r\n  }\r\n\r\n  @Test\r\n  public void testErrorWithoutFlag() {\r\n  }\r\n\r\n  @Override\r\n  public void testExecution() throws Exception {\r\n    final PreprocessorContext mock = prepareMockContext();\r\n\r\n    assertFalse(HANDLER.processCommandLineKey(\"/es:\", mock));\r\n    assertFalse(HANDLER.processCommandLineKey(\"/EK\", mock));\r\n    assertFalse(HANDLER.processCommandLineKey(\"/E \", mock));\r\n    verify(mock, never()).setAllowWhitespaces(anyBoolean());\r\n\r\n    assertTrue(HANDLER.processCommandLineKey(\"/ES\", mock));\r\n    verify(mock).setAllowWhitespaces(true);\r\n    reset(mock);\r\n\r\n    assertTrue(HANDLER.processCommandLineKey(\"/es\", mock));\r\n    verify(mock).setAllowWhitespaces(true);\r\n    reset(mock);\r\n  }\r\n\r\n  @Override\r\n  public void testName() {\r\n    assertEquals(\"/ES\", HANDLER.getKeyName());\r\n  }\r\n\r\n  @Override\r\n  public void testDescription() {\r\n    assertDescription(HANDLER);\r\n  }\r\n}\r\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/CareForLastEolHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.anyBoolean;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.reset;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class CareForLastEolHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final CareForLastEolHandler HANDLER = new CareForLastEolHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"/n:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/NN\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/N \", mock));\n    verify(mock, never()).setClearTarget(anyBoolean());\n\n    assertTrue(HANDLER.processCommandLineKey(\"/N\", mock));\n    verify(mock).setCareForLastEol(true);\n    reset(mock);\n\n    assertTrue(HANDLER.processCommandLineKey(\"/n\", mock));\n    verify(mock).setCareForLastEol(true);\n    reset(mock);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/N\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/ClearTargetFolderHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.anyBoolean;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.reset;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class ClearTargetFolderHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final ClearTargetHandler HANDLER = new ClearTargetHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"/c:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/CC\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/C \", mock));\n    verify(mock, never()).setClearTarget(anyBoolean());\n\n    assertTrue(HANDLER.processCommandLineKey(\"/C\", mock));\n    verify(mock).setClearTarget(true);\n    reset(mock);\n\n    assertTrue(HANDLER.processCommandLineKey(\"/c\", mock));\n    verify(mock).setClearTarget(true);\n    reset(mock);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/C\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/CommentRemoverTypeHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertThrows;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\n\npublic class CommentRemoverTypeHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final KeepCommentsHandler HANDLER = new KeepCommentsHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/m\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/mm:\", mock));\n    assertThrows(PreprocessorException.class, () -> HANDLER.processCommandLineKey(\"/m:\", mock));\n\n    assertEquals(CommentRemoverType.REMOVE_C_STYLE, mock.getKeepComments());\n    assertTrue(HANDLER.processCommandLineKey(\"/m:keep_all\", mock));\n    assertEquals(CommentRemoverType.KEEP_ALL, mock.getKeepComments());\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/M:\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/DestinationDirectoryHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.io.File;\nimport org.mockito.ArgumentCaptor;\n\npublic class DestinationDirectoryHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final DestinationDirectoryHandler HANDLER = new DestinationDirectoryHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n    assertFalse(HANDLER.processCommandLineKey(\"/s:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/O:\", mock));\n    assertTrue(HANDLER.processCommandLineKey(\"/O:test\", mock));\n\n    ArgumentCaptor<File> captor = ArgumentCaptor.forClass(File.class);\n    verify(mock).setTarget(captor.capture());\n\n    assertEquals(\"test\", captor.getValue().getPath());\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/O:\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/DontOverwriteSameContentHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.anyBoolean;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.reset;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class DontOverwriteSameContentHandlerTest extends AbstractCommandLineHandlerTest {\n  private static final DontOverwriteSameContentHandler HANDLER =\n      new DontOverwriteSameContentHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"/z:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/ZZ\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/Z \", mock));\n    verify(mock, never()).setDontOverwriteSameContent(anyBoolean());\n\n    assertTrue(HANDLER.processCommandLineKey(\"/Z\", mock));\n    verify(mock).setDontOverwriteSameContent(true);\n    reset(mock);\n\n    assertTrue(HANDLER.processCommandLineKey(\"/z\", mock));\n    verify(mock).setDontOverwriteSameContent(true);\n    reset(mock);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/Z\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/ExcludeFoldersHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertArrayEquals;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.io.File;\nimport java.util.List;\nimport org.mockito.ArgumentCaptor;\n\n@SuppressWarnings(\"unchecked\")\npublic class ExcludeFoldersHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final ExcludeFoldersHandler HANDLER = new ExcludeFoldersHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/ed:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/Ed:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/ED\", mock));\n\n    assertTrue(HANDLER.processCommandLineKey(\n        \"/ed:testdir/**/hd\" + File.pathSeparator + \"zoom\" + File.pathSeparator + \"g?df\", mock));\n\n    final ArgumentCaptor<List<String>> captor = ArgumentCaptor.forClass(List.class);\n\n    verify(mock).setExcludeFolders(captor.capture());\n    assertArrayEquals(new String[] {\"testdir/**/hd\", \"zoom\", \"g?df\"},\n        captor.getValue().toArray(new String[0]));\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/ED:\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/ExcludedFileExtensionsHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.any;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.Arrays;\n\npublic class ExcludedFileExtensionsHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final ExcludedFileExtensionsHandler HANDLER = new ExcludedFileExtensionsHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/ef:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/ef\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/EF:\", mock));\n\n    verify(mock, never()).setExcludeExtensions(any());\n\n    assertTrue(HANDLER.processCommandLineKey(\"/ef:rrr,Ggg,bBb\", mock));\n    verify(mock).setExcludeExtensions(Arrays.asList(\"rrr\", \"Ggg\", \"bBb\"));\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/EF:\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/FileExtensionsHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.any;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.Arrays;\n\npublic class FileExtensionsHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final FileExtensionsHandler HANDLER = new FileExtensionsHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/f:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/f\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/F:\", mock));\n\n    verify(mock, never()).setExcludeExtensions(any());\n\n    assertTrue(HANDLER.processCommandLineKey(\"/f:rrr,Ggg,bBb\", mock));\n    verify(mock).setExtensions(Arrays.asList(\"rrr\", \"Ggg\", \"bBb\"));\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/F:\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/GlobalVariableDefiningFileHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.TestUtils;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.File;\nimport java.util.List;\nimport org.junit.Test;\n\npublic final class GlobalVariableDefiningFileHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final GlobalVariableDefiningFileHandler HANDLER =\n      new GlobalVariableDefiningFileHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n\n    final File testFile =\n        new File(this.getClass().getResource(\"./global_variable_def.txt\").toURI());\n\n    final String param = \"@\" + PreprocessorUtils.getFilePath(testFile);\n\n    HANDLER.processCommandLineKey(param, context);\n\n    final List<File> configFiles = context.getConfigFiles();\n\n    assertEquals(\"File must be added\", 1, configFiles.size());\n    TestUtils.assertFilePath(\"File must be equal\", testFile, configFiles.get(0));\n  }\n\n  @Test\n  public void testExecution_Expression() throws Exception {\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n\n    final File testFile =\n        new File(this.getClass().getResource(\"./global_variable_def.txt\").toURI());\n\n    final String path = testFile.getParent().replace('\\'', '/').replace(\"\\\"\", \"\\\\\\\"\");\n\n    final String param =\n        \"@@\\\"\" + path.replace(\"\\\\\", \"\\\\\\\\\") + \"\\\"+\\\"/\\\"+\\\"\" + \"global_variable_def.txt\" + \"\\\"\";\n\n    HANDLER.processCommandLineKey(param, context);\n\n    final List<File> configFiles = context.getConfigFiles();\n\n    assertEquals(\"File must be added\", 1, configFiles.size());\n    assertEquals(\"File must be equal\", testFile, configFiles.get(0));\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_nonExistingFileWithExpression() {\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    HANDLER.processCommandLineKey(\"@@\\\"undefinded_file.111111.txtt\\\"\", context);\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_nonExistingFile() {\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    HANDLER.processCommandLineKey(\"@undefinded_file.111111.txtt\", context);\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_emptyFile() {\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    HANDLER.processCommandLineKey(\"@\", context);\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_emptyFileForExpressionMode() {\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    HANDLER.processCommandLineKey(\"@@\", context);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"@\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/GlobalVariableHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class GlobalVariableHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final GlobalVariableHandler HANDLER = new GlobalVariableHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/p\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/pp:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/P:\", mock));\n\n    assertTrue(HANDLER.processCommandLineKey(\"/P:hello=0\", mock));\n\n    verify(mock).setGlobalVariable(\"hello\", Value.INT_ZERO);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/P:\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/HelpHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class HelpHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final HelpHandler HANDLER = new HelpHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n    assertFalse(HANDLER.processCommandLineKey(\"\", context));\n    assertFalse(HANDLER.processCommandLineKey(\"/HH\", context));\n    assertFalse(HANDLER.processCommandLineKey(\"/??\", context));\n    assertFalse(HANDLER.processCommandLineKey(\"-??\", context));\n\n    assertTrue(HANDLER.processCommandLineKey(\"/?\", context));\n    assertTrue(HANDLER.processCommandLineKey(\"/h\", context));\n    assertTrue(HANDLER.processCommandLineKey(\"-H\", context));\n    assertTrue(HANDLER.processCommandLineKey(\"-?\", context));\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/H,/?,-H,-?\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/InCharsetHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.reset;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.nio.charset.StandardCharsets;\nimport org.mockito.Mockito;\n\npublic class InCharsetHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final InCharsetHandler HANDLER = new InCharsetHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n    assertFalse(HANDLER.processCommandLineKey(\"/o:UUU\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/T:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/t\", mock));\n    assertTrue(HANDLER.processCommandLineKey(\"/t:\" + StandardCharsets.UTF_16.name(), mock));\n    verify(mock).setSourceEncoding(StandardCharsets.UTF_16);\n\n    reset(mock);\n\n    assertTrue(HANDLER.processCommandLineKey(\"/T:\" + StandardCharsets.UTF_16LE, mock));\n    Mockito.verify(mock).setSourceEncoding(StandardCharsets.UTF_16LE);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/T:\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/KeepLineHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.anyBoolean;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.reset;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class KeepLineHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final KeepLineHandler HANDLER = new KeepLineHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"/k:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/KK\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/K \", mock));\n    verify(mock, never()).setKeepLines(anyBoolean());\n\n    assertTrue(HANDLER.processCommandLineKey(\"/K\", mock));\n    verify(mock).setKeepLines(true);\n    reset(mock);\n\n    assertTrue(HANDLER.processCommandLineKey(\"/k\", mock));\n    verify(mock).setKeepLines(true);\n    reset(mock);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/K\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/OutCharsetHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.reset;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.nio.charset.StandardCharsets;\n\npublic class OutCharsetHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final OutCharsetHandler HANDLER = new OutCharsetHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"/o:UUU\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/TT:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/tT\", mock));\n    assertTrue(HANDLER.processCommandLineKey(\"/tt:\" + StandardCharsets.UTF_16.name(), mock));\n    verify(mock).setTargetEncoding(StandardCharsets.UTF_16);\n\n    reset(mock);\n\n    assertTrue(HANDLER.processCommandLineKey(\"/TT:\" + StandardCharsets.UTF_16LE.name(), mock));\n    verify(mock).setTargetEncoding(StandardCharsets.UTF_16LE);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/TT:\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/PreserveIndentDirectiveHandlerTest.java",
    "content": "/*\r\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\r\n *\r\n * Licensed to the Apache Software Foundation (ASF) under one\r\n * or more contributor license agreements.  See the NOTICE file\r\n * distributed with this work for additional information\r\n * regarding copyright ownership.  The ASF licenses this file\r\n * to you under the Apache License, Version 2.0 (the\r\n * \"License\"); you may not use this file except in compliance\r\n * with the License.  You may obtain a copy of the License at\r\n *\r\n *   http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing,\r\n * software distributed under the License is distributed on an\r\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n * KIND, either express or implied.  See the License for the\r\n * specific language governing permissions and limitations\r\n * under the License.\r\n */\r\n\r\npackage com.igormaznitsa.jcp.cmdline;\r\n\r\nimport static org.junit.Assert.assertEquals;\r\nimport static org.junit.Assert.assertFalse;\r\nimport static org.junit.Assert.assertTrue;\r\nimport static org.mockito.Mockito.anyBoolean;\r\nimport static org.mockito.Mockito.never;\r\nimport static org.mockito.Mockito.reset;\r\nimport static org.mockito.Mockito.verify;\r\n\r\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\r\n\r\npublic class PreserveIndentDirectiveHandlerTest extends AbstractCommandLineHandlerTest {\r\n\r\n  private static final PreserveIndentDirectiveHandler HANDLER =\r\n      new PreserveIndentDirectiveHandler();\r\n\r\n  @Override\r\n  public void testThatTheHandlerInTheHandlerList() {\r\n    assertHandlerInTheHandlerList(HANDLER);\r\n  }\r\n\r\n  @Override\r\n  public void testExecution() throws Exception {\r\n    final PreprocessorContext mock = prepareMockContext();\r\n\r\n    assertFalse(HANDLER.processCommandLineKey(\"/Pi:\", mock));\r\n    assertFalse(HANDLER.processCommandLineKey(\"/PI \", mock));\r\n    verify(mock, never()).setPreserveIndents(anyBoolean());\r\n\r\n    assertTrue(HANDLER.processCommandLineKey(\"/PI\", mock));\r\n    verify(mock).setPreserveIndents(true);\r\n    reset(mock);\r\n\r\n    assertTrue(HANDLER.processCommandLineKey(\"/PI\", mock));\r\n    verify(mock).setPreserveIndents(true);\r\n    reset(mock);\r\n  }\r\n\r\n  @Override\r\n  public void testName() {\r\n    assertEquals(\"/PI\", HANDLER.getKeyName());\r\n  }\r\n\r\n  @Override\r\n  public void testDescription() {\r\n    assertDescription(HANDLER);\r\n  }\r\n}\r\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/RemoveCommentsHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class RemoveCommentsHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final RemoveCommentsHandler HANDLER = new RemoveCommentsHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/r:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/R:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/RR\", mock));\n\n    assertTrue(HANDLER.processCommandLineKey(\"/r\", mock));\n    verify(mock).setKeepComments(CommentRemoverType.REMOVE_C_STYLE);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/R\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/SourceDirectoryHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.io.File;\nimport java.util.Arrays;\n\npublic class SourceDirectoryHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final SourceDirectoryHandler HANDLER = new SourceDirectoryHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/i:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/I:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/II\", mock));\n\n    assertTrue(\n        HANDLER.processCommandLineKey(\"/i:testdir\" + File.pathSeparatorChar + \"somedir\", mock));\n    verify(mock).setSources(Arrays.asList(\"testdir\", \"somedir\"));\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/I:\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/UnknownAsFalseHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.anyBoolean;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.reset;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class UnknownAsFalseHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final UnknownAsFalseHandler HANDLER = new UnknownAsFalseHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"/u:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/UU\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/U:\", mock));\n    verify(mock, never()).setUnknownVariableAsFalse(anyBoolean());\n\n    assertTrue(HANDLER.processCommandLineKey(\"/U\", mock));\n    verify(mock).setUnknownVariableAsFalse(true);\n    reset(mock);\n\n    assertTrue(HANDLER.processCommandLineKey(\"/u\", mock));\n    verify(mock).setUnknownVariableAsFalse(true);\n    reset(mock);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/U\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/cmdline/VerboseHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.cmdline;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class VerboseHandlerTest extends AbstractCommandLineHandlerTest {\n\n  private static final VerboseHandler HANDLER = new VerboseHandler();\n\n  @Override\n  public void testThatTheHandlerInTheHandlerList() {\n    assertHandlerInTheHandlerList(HANDLER);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext mock = prepareMockContext();\n\n    assertFalse(HANDLER.processCommandLineKey(\"\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/v:\", mock));\n    assertFalse(HANDLER.processCommandLineKey(\"/VV\", mock));\n\n    assertTrue(HANDLER.processCommandLineKey(\"/v\", mock));\n    verify(mock).setVerbose(true);\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"/V\", HANDLER.getKeyName());\n  }\n\n  @Override\n  public void testDescription() {\n    assertDescription(HANDLER);\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/context/EnvironmentVariableProcessorTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.context;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\nimport com.igormaznitsa.jcp.AbstractMockPreprocessorContextTest;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport org.junit.Test;\n\npublic class EnvironmentVariableProcessorTest extends AbstractMockPreprocessorContextTest {\n\n  @Test\n  public void testReadVariable() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final String javaVersion = System.getProperty(\"java.version\");\n    final String osName = System.getProperty(\"os.name\");\n\n    assertNotNull(\"Must not be null\", javaVersion);\n    assertNotNull(\"Must not be null\", osName);\n\n    final EnvironmentVariableProcessor test = new EnvironmentVariableProcessor();\n\n    assertEquals(\"Must be equal\", javaVersion,\n        test.getVariable(\"env.java.version\", context).asString());\n    assertEquals(\"Must be equal\", osName, test.getVariable(\"env.os.name\", context).asString());\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testReadUnknownVariable() throws Exception {\n    new EnvironmentVariableProcessor().getVariable(\"kjhaksjdhksajqwoiueoqiwue\",\n        prepareMockContext());\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testWriteVariable() throws Exception {\n    PreprocessorContext context = prepareMockContext();\n    new EnvironmentVariableProcessor().setVariable(\"kjhaksjdhksajqwoiueoqiwue\", Value.BOOLEAN_FALSE,\n        context);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/context/JCPSpecialVariableProcessorTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.context;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\nimport com.igormaznitsa.jcp.AbstractMockPreprocessorContextTest;\nimport com.igormaznitsa.jcp.InfoHelper;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport java.io.File;\nimport org.junit.Test;\n\npublic class JCPSpecialVariableProcessorTest extends AbstractMockPreprocessorContextTest {\n\n  @Test\n  public void testReadVariable() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    assertEquals(\"Must be equal\", InfoHelper.getVersion(),\n        new JCPSpecialVariableProcessor().getVariable(\"jcp.version\", context).asString());\n    assertNotNull(new JCPSpecialVariableProcessor().getVariable(\"__line__\", context).toString());\n    assertNotNull(new JCPSpecialVariableProcessor().getVariable(\"__date__\", context).asString());\n    assertNotNull(new JCPSpecialVariableProcessor().getVariable(\"__time__\", context).asString());\n    assertNotNull(\n        new JCPSpecialVariableProcessor().getVariable(\"__timestamp__\", context).asString());\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testReadUnknownVariable() {\n    new JCPSpecialVariableProcessor().getVariable(\"jcp.version2\",\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\")));\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testWriteDisallowed() {\n    new JCPSpecialVariableProcessor().setVariable(\"jcp.version\", Value.INT_ONE,\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\")));\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/context/PreprocessorContextTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.context;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertSame;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport java.io.File;\nimport java.lang.reflect.Array;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Modifier;\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Random;\nimport java.util.Set;\nimport org.junit.Test;\n\n@SuppressWarnings(\"rawtypes\")\npublic class PreprocessorContextTest {\n\n  private static final Random RND = new Random(776655);\n\n  private static Set<Field> extractDeclaredNonStaticNonFinalFields(final Class<?> targetClass) {\n    final Set<Field> result = new HashSet<>();\n    for (final Field f : targetClass.getDeclaredFields()) {\n      if ((f.getModifiers() & (Modifier.STATIC | Modifier.FINAL)) != 0) {\n        continue;\n      }\n      result.add(f);\n    }\n    return result;\n  }\n\n  private static Map<Field, Object> extractValues(final PreprocessorContext context)\n      throws Exception {\n    final Map<Field, Object> result = new HashMap<>();\n    for (final Field f : extractDeclaredNonStaticNonFinalFields(PreprocessorContext.class)) {\n      f.setAccessible(true);\n      result.put(f, f.get(context));\n    }\n    return result;\n  }\n\n  private static void assertObjectValue(final String fieldName, final Object value,\n                                        final Object that) {\n    if (value != that) {\n      if (value == null || that == null) {\n        assertSame(fieldName, value, that);\n      } else if (List.class.isAssignableFrom(value.getClass())) {\n        final List thisList = (List) value;\n        final List thatList = (List) that;\n        assertEquals(fieldName, thisList.size(), thatList.size());\n\n        for (int i = 0; i < thisList.size(); i++) {\n          assertObjectValue(fieldName, thisList.get(i), thatList.get(i));\n        }\n\n      } else if (Map.class.isAssignableFrom(value.getClass())) {\n        final Map thisMap = (Map) value;\n        final Map thatMap = (Map) that;\n        assertEquals(fieldName, thisMap.size(), thatMap.size());\n\n        for (final Object k : thisMap.keySet()) {\n          final Object thisValue = thisMap.get(k);\n          assertTrue(fieldName, thatMap.containsKey(k));\n          assertObjectValue(fieldName, thisValue, thatMap.get(k));\n        }\n\n      } else if (Set.class.isAssignableFrom(value.getClass())) {\n        final Set thisSet = (Set) value;\n        final Set thatSet = (Set) that;\n        assertEquals(fieldName, thisSet.size(), thatSet.size());\n\n        for (final Object v : thisSet) {\n          assertTrue(fieldName, thatSet.contains(v));\n        }\n\n      } else if (value.getClass().isArray()) {\n        assertEquals(Array.getLength(value), Array.getLength(that));\n        for (int i = 0; i < Array.getLength(value); i++) {\n          assertObjectValue(fieldName, Array.get(value, i), Array.get(that, i));\n        }\n      } else {\n        assertEquals(fieldName, value, that);\n      }\n    }\n  }\n\n  private static void assertMapFields(final String mapFieldName, final PreprocessorContext etalon,\n                                      final PreprocessorContext that) throws Exception {\n    Field field = null;\n    for (final Field f : PreprocessorContext.class.getDeclaredFields()) {\n      if (mapFieldName.equals(f.getName())) {\n        field = f;\n        field.setAccessible(true);\n        break;\n      }\n    }\n\n    assertNotNull(\"Can't find field \" + mapFieldName, field);\n\n    final Map thisMap = (Map) field.get(etalon);\n    final Map thatMap = (Map) field.get(that);\n\n    assertEquals(\"Map fields must have same size '\" + mapFieldName + '\\'', thisMap, thatMap);\n\n    for (final Object k : thisMap.keySet()) {\n      assertTrue(thatMap.containsKey(k));\n      assertSame(\"Key '\" + k + \"' at map field '\" + mapFieldName + \"'\", thisMap.get(k),\n          thatMap.get(k));\n    }\n  }\n\n  private static void assertPreprocessorContextMaps(final PreprocessorContext etalon,\n                                                    final PreprocessorContext that)\n      throws Exception {\n    int detected = 0;\n    for (final Field f : PreprocessorContext.class.getDeclaredFields()) {\n      if (Modifier.isFinal(f.getModifiers()) && Map.class.isAssignableFrom(f.getType())) {\n        assertMapFields(f.getName(), etalon, that);\n        detected++;\n      }\n    }\n    assertEquals(4, detected);\n  }\n\n  private static void assertContextEquals(final Map<Field, Object> etalon,\n                                          final Map<Field, Object> value) {\n    assertEquals(\"Must have same number of elements\", etalon.size(), value.size());\n\n    for (final Field f : etalon.keySet()) {\n      assertObjectValue(f.getName(), etalon.get(f), value.get(f));\n    }\n  }\n\n  private static String randomString() {\n    final StringBuilder result = new StringBuilder();\n\n    for (int i = 0; i < 32; i++) {\n      result.append((char) ('a' + RND.nextInt(52)));\n    }\n\n    return result.toString();\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  private static void fillByRandomValues(final PreprocessorContext context) throws Exception {\n\n    for (final Field f : extractDeclaredNonStaticNonFinalFields(PreprocessorContext.class)) {\n      f.setAccessible(true);\n\n      final Class type = f.getType();\n\n      if (type.isArray()) {\n        if (type.getComponentType() == String.class) {\n          final String[] arr = new String[RND.nextInt(32) + 1];\n          for (int i = 0; i < arr.length; i++) {\n            arr[i] = randomString();\n          }\n          f.set(context, arr);\n        } else if (type.getComponentType() == File.class) {\n          final File[] arr = new File[RND.nextInt(32) + 1];\n          for (int i = 0; i < arr.length; i++) {\n            arr[i] = new File(randomString());\n          }\n          f.set(context, arr);\n        } else {\n          throw new Error(\"Unexpected array field type : \" + type.getComponentType().getName());\n        }\n      } else if (type == Boolean.class || type == boolean.class) {\n        f.set(context, RND.nextBoolean());\n      } else if (type == Integer.class || type == int.class) {\n        f.set(context, RND.nextInt(10000));\n      } else if (type == String.class) {\n        f.set(context, randomString());\n      } else if (type == File.class) {\n        f.set(context, new File(randomString()));\n      } else if (Set.class.isAssignableFrom(type)) {\n        final String[] arr = new String[RND.nextInt(32) + 1];\n        for (int i = 0; i < arr.length; i++) {\n          arr[i] = randomString();\n        }\n        try {\n          f.set(context, new HashSet<>(Arrays.asList(arr)));\n        } catch (Exception ex) {\n          fail(\"Can't set value to '\" + f.getName() + '\\'');\n        }\n      } else if (type == Charset.class) {\n        final Charset charset;\n        switch (RND.nextInt(4)) {\n          case 0:\n            charset = StandardCharsets.ISO_8859_1;\n            break;\n          case 1:\n            charset = StandardCharsets.US_ASCII;\n            break;\n          case 2:\n            charset = StandardCharsets.UTF_16;\n            break;\n          case 3:\n            charset = StandardCharsets.UTF_16BE;\n            break;\n          default:\n            charset = StandardCharsets.UTF_8;\n            break;\n        }\n        f.set(context, charset);\n      } else if (type == PreprocessingState.class) {\n        f.set(context,\n            new PreprocessingState(context, StandardCharsets.UTF_8, StandardCharsets.UTF_8));\n      } else if (type == PreprocessorLogger.class) {\n        f.set(context, new PreprocessorLogger() {\n          @Override\n          public void error(String message) {\n          }\n\n          @Override\n          public void info(String message) {\n          }\n\n          @Override\n          public void debug(String message) {\n          }\n\n          @Override\n          public void warning(String message) {\n          }\n        });\n      } else if (type == PreprocessorExtension.class) {\n        final PreprocessorExtension exx = new PreprocessorExtension() {\n          @Override\n          public boolean hasAction(int arity) {\n            return true;\n          }\n\n          @Override\n          public boolean hasUserFunction(String name, Set<Integer> arity) {\n            return true;\n          }\n\n          @Override\n          public boolean processAction(PreprocessorContext context, List<Value> parameters) {\n            throw new UnsupportedOperationException(\n                \"Not supported yet.\");\n          }\n\n          @Override\n          public Value processUserFunction(PreprocessorContext context, String functionName,\n                                           List<Value> arguments) {\n            throw new UnsupportedOperationException(\n                \"Not supported yet.\");\n          }\n\n          @Override\n          public Set<Integer> getUserFunctionArity(String functionName) {\n            throw new UnsupportedOperationException(\n                \"Not supported yet.\");\n          }\n        };\n\n        f.set(context, exx);\n      } else if (type.isAssignableFrom(CommentRemoverType.class)) {\n        f.set(context, CommentRemoverType.values()[((int) System.nanoTime() & 0x1FFFFFFF) %\n            CommentRemoverType.values().length]);\n      } else if (type.isAssignableFrom(List.class) || type.isAssignableFrom(Set.class)) {\n        // ignored\n      } else {\n        throw new Error(String.format(\"Unexpected %s %s\", f.getName(), type.getName()));\n      }\n    }\n\n    context.setLocalVariable(\"LocalHelloOne\", Value.INT_ONE);\n    context.setGlobalVariable(\"GlobalHelloOne\", Value.INT_FIVE);\n    context.setSharedResource(\"RESOURCE111\", \"Some string\");\n    context.registerSpecialVariableProcessor(new SpecialVariableProcessor() {\n      @Override\n      public Set<String> getVariableNames() {\n        return Set.of(\"uno::\", \"tuo::\");\n      }\n\n      @Override\n      public Value getVariable(String varName, PreprocessorContext context) {\n        throw new UnsupportedOperationException(\n            \"Not supported yet.\");\n      }\n\n      @Override\n      public void setVariable(String varName, Value value, PreprocessorContext context) {\n        throw new UnsupportedOperationException(\n            \"Not supported yet.\");\n      }\n    });\n  }\n\n  @Test\n  public void testConstuctorWithBaseContext_DefaultValues() throws Exception {\n    final PreprocessorContext baseContext =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n\n    final Map<Field, Object> baseContextValues = extractValues(baseContext);\n    assertFalse(baseContextValues.isEmpty());\n\n    final PreprocessorContext clonedContext = new PreprocessorContext(baseContext);\n    final Map<Field, Object> clonedContextValues = extractValues(clonedContext);\n\n    assertFalse(baseContext.isCloned());\n    assertTrue(clonedContext.isCloned());\n    assertContextEquals(baseContextValues, clonedContextValues);\n    assertPreprocessorContextMaps(baseContext, clonedContext);\n  }\n\n  @Test\n  public void testConstructorWithBaseContext_RandomValues() throws Exception {\n    for (int i = 0; i < 100; i++) {\n      final PreprocessorContext etalon =\n          new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n      fillByRandomValues(etalon);\n      final PreprocessorContext cloned = new PreprocessorContext(etalon);\n      assertFalse(etalon.isCloned());\n      assertTrue(cloned.isCloned());\n\n      assertContextEquals(extractValues(etalon), extractValues(cloned));\n      assertPreprocessorContextMaps(etalon, cloned);\n    }\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/context/ProcessContentWithSpacesAndWithoutTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.context;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.AbstractSpyPreprocessorContextTest;\nimport com.igormaznitsa.jcp.TestUtils;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport org.junit.Test;\n\npublic class ProcessContentWithSpacesAndWithoutTest extends AbstractSpyPreprocessorContextTest {\n\n  @Test\n  public void testProcess_NoSpaced_SpacesNotAllowed() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    final String text =\n        Expression.evalExpression(\"evalfile(\\\"./standardFile.txt\\\")\", context).asString();\n    assertEquals(\" hello\\n /*$VAR$*/ Universe\\nsome test\", TestUtils.normalizeNextLine(text));\n  }\n\n  @Test\n  public void testProcess_NoSpaced_SpacesAllowed() throws Exception {\n    final PreprocessorContext context =\n        preparePreprocessorContext(getCurrentTestFolder(), () -> true);\n    final String text =\n        Expression.evalExpression(\"evalfile(\\\"./standardFile.txt\\\")\", context).asString();\n    assertEquals(\" hello\\n /*$VAR$*/ Universe\\nsome test\", TestUtils.normalizeNextLine(text));\n  }\n\n  @Test\n  public void testProcess_Spaced_SpacesNotAllowed() throws Exception {\n    try {\n      final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n      Expression.evalExpression(\"evalfile(\\\"./spacedFile.txt\\\")\", context).asString();\n      fail(\"Must throw preprocessor exception\");\n    } catch (PreprocessorException ex) {\n      assertTrue(ex.getMessage().contains(\"Unknown variable\"));\n    }\n  }\n\n  @Test\n  public void testProcess_Spaced_SpacesAllowed() throws Exception {\n    final PreprocessorContext context =\n        preparePreprocessorContext(getCurrentTestFolder(), () -> true);\n    final String text =\n        Expression.evalExpression(\"evalfile(\\\"./spacedFile.txt\\\")\", context).asString();\n    assertEquals(\" hello\\n /*$VAR$*/ Universe\\nsome test\", TestUtils.normalizeNextLine(text));\n  }\n\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/AbortDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport org.junit.Test;\n\npublic class AbortDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final AbortDirectiveHandler HANDLER = new AbortDirectiveHandler();\n\n  @Test\n  public void testExecution_wrongExpression() {\n    assertPreprocessorException(\"\\n\\n //#abort /*$akljldksajdsad$*/\", 3, null);\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_abort.txt\", false, null, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"abort\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.TAIL, HANDLER.getArgumentType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/AbstractDirectiveHandlerAcceptanceTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static java.util.Collections.emptyList;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.containers.TextFileDataContainer;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessingState.ExcludeIfInfo;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport java.io.BufferedReader;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.StringReader;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.function.Consumer;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic abstract class AbstractDirectiveHandlerAcceptanceTest {\n\n  protected static File THIS_CLASS_FILE;\n\n  @BeforeClass\n  public static void beforeClass() throws Exception {\n    THIS_CLASS_FILE = new File(AbstractDirectiveHandler.class.getResource(\n        AbstractDirectiveHandlerAcceptanceTest.class.getSimpleName() + \".class\").toURI());\n  }\n\n  @Test\n  public abstract void testExecution() throws Exception;\n\n  @Test\n  public abstract void testKeyword() throws Exception;\n\n  @Test\n  public abstract void testExecutionCondition() throws Exception;\n\n  @Test\n  public abstract void testReference() throws Exception;\n\n  @Test\n  public abstract void testArgumentType() throws Exception;\n\n  @Test\n  public abstract void testPhase() throws Exception;\n\n  protected void assertReference(final AbstractDirectiveHandler handler) {\n    assertNotNull(\"Handler must not be null\", handler);\n    final String reference = handler.getReference();\n\n    assertNotNull(\"Reference must not be null\", reference);\n    assertNotNull(\"Reference must not empty\", reference.isEmpty());\n    assertFalse(\"Reference must not be too short\", reference.length() < 10);\n  }\n\n  private PreprocessorContext setGlobalVars(final PreprocessorContext context,\n                                            final VariablePair... vars) {\n    if (vars.length != 0) {\n      for (final VariablePair p : vars) {\n        context.setGlobalVariable(p.getName(), p.getValue());\n      }\n    }\n    return context;\n  }\n\n  public void assertPreprocessorException(final String preprocessingText,\n                                          final int exceptionStringIndex,\n                                          final PreprocessorExtension extension,\n                                          final VariablePair... globalVars) {\n    try {\n      preprocessString(preprocessingText, null, extension, globalVars);\n      fail(\"Must throw PreprocessorException\");\n    } catch (PreprocessorException expected) {\n      assertEquals(\"Expected \" + PreprocessorException.class.getCanonicalName(),\n          exceptionStringIndex, expected.getLineNumber());\n    } catch (Exception unExpected) {\n      unExpected.printStackTrace();\n      fail(\"Unexpected exception \" + unExpected.getClass().getCanonicalName());\n    }\n\n  }\n\n  public void assertGlobalPhaseException(final String preprocessingText,\n                                         final int exceptionStringIndex,\n                                         final PreprocessorExtension extension) {\n    try {\n      preprocessStringAtGlobalPhase(preprocessingText, null);\n      fail(\"Must throw PreprocessorException\");\n    } catch (PreprocessorException expected) {\n      assertEquals(\"Expected \" + PreprocessorException.class.getCanonicalName(),\n          exceptionStringIndex, expected.getLineNumber());\n    } catch (Exception unExpected) {\n      unExpected.printStackTrace();\n      fail(\"Unexpected exception \" + unExpected.getClass().getCanonicalName());\n    }\n  }\n\n  private PreprocessorContext preprocessStringAtGlobalPhase(final String encoding,\n                                                            final List<ExcludeIfInfo> excludeInfoList)\n      throws IOException {\n    final List<String> parsedText = parseStringForLines(encoding);\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    context.setDryRun(true);\n\n    final FileInfoContainer reference = new FileInfoContainer(THIS_CLASS_FILE, \"fake_name\", false);\n    final TextFileDataContainer textContainer =\n        new TextFileDataContainer(reference.getSourceFile(), parsedText.toArray(new String[0]),\n            false, 0);\n    final PreprocessingState state = context.produceNewPreprocessingState(reference, textContainer);\n\n    final List<ExcludeIfInfo> result = reference.processGlobalDirectives(context, state);\n\n    if (excludeInfoList != null) {\n      excludeInfoList.addAll(result);\n    }\n\n    return context;\n  }\n\n  public PreprocessorContext executeGlobalPhase(final String fileName,\n                                                final List<ExcludeIfInfo> excludeIf)\n      throws Exception {\n    final File file = new File(getClass().getResource(fileName).toURI());\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    context.setDryRun(true);\n\n    final FileInfoContainer reference = new FileInfoContainer(file, file.getName(), false);\n    final List<ExcludeIfInfo> result = reference.processGlobalDirectives(context, null);\n\n    if (excludeIf != null) {\n      excludeIf.addAll(result);\n    }\n    return context;\n  }\n\n  private void readWholeDataFromReader(final BufferedReader reader, final List<String> accumulator)\n      throws IOException {\n    while (!Thread.currentThread().isInterrupted()) {\n      final String line = reader.readLine();\n      if (line == null) {\n        break;\n      }\n      accumulator.add(line);\n    }\n  }\n\n  private void assertEqualsStringLists(final List<String> etalon, final List<String> result) {\n    final String[] etalonStrings = etalon.toArray(new String[0]);\n    final String[] resultStrings = result.toArray(new String[0]);\n    final int len = Math.max(etalonStrings.length, resultStrings.length);\n\n    for (int i = 0; i < len; i++) {\n      final String etalonStr = i < etalonStrings.length ? etalonStrings[i] : null;\n      final String resultStr = i < resultStrings.length ? resultStrings[i] : null;\n\n      if ((etalonStr != null && !etalonStr.equals(resultStr)) ||\n          (resultStr != null && !resultStr.equals(etalonStr))) {\n        throw new LinesNotMatchException(etalonStrings.length, resultStrings.length, i, etalonStr,\n            resultStr);\n      }\n    }\n  }\n\n  private PreprocessorContext internalPreprocessAndMatch(final File srcfile,\n                                                         final List<String> preprocessingText,\n                                                         final List<String> result,\n                                                         final List<String> etalonList,\n                                                         final PreprocessorExtension extension,\n                                                         final PreprocessorLogger logger,\n                                                         final boolean keepLines,\n                                                         final boolean allowBlocks,\n                                                         final Consumer<PreprocessorContext> contextTuner,\n                                                         final VariablePair... globalVariables)\n      throws Exception {\n    assertNotNull(\"Preprocessing text is null\", preprocessingText);\n    assertNotNull(\"Result container is null\", result);\n\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    if (logger != null) {\n      context.setPreprocessorLogger(logger);\n    }\n    context.setDryRun(true);\n    context.setSources(Collections.singletonList(srcfile.getParent()));\n    context.setKeepLines(keepLines);\n    context.setAllowsBlocks(allowBlocks);\n    context.addPreprocessorExtension(extension);\n\n    setGlobalVars(context, globalVariables);\n\n    final FileInfoContainer reference = new FileInfoContainer(srcfile, srcfile.getName(), false);\n    final PreprocessingState state = context.produceNewPreprocessingState(reference,\n        new TextFileDataContainer(reference.getSourceFile(),\n            preprocessingText.toArray(new String[0]), false, 0));\n    context.addPreprocessedResource(reference);\n\n    if (contextTuner != null) {\n      contextTuner.accept(context);\n    }\n\n    reference.preprocessFileWithNotification(context, state, true);\n\n    final ByteArrayOutputStream prefix = new ByteArrayOutputStream();\n    final ByteArrayOutputStream normal = new ByteArrayOutputStream();\n    final ByteArrayOutputStream postfix = new ByteArrayOutputStream();\n\n    state.saveBuffersToStreams(prefix, normal, postfix);\n\n    final BufferedReader prefixReader = new BufferedReader(\n        new InputStreamReader(new ByteArrayInputStream(prefix.toByteArray()),\n            StandardCharsets.UTF_8));\n    final BufferedReader normalReader = new BufferedReader(\n        new InputStreamReader(new ByteArrayInputStream(normal.toByteArray()),\n            StandardCharsets.UTF_8));\n    final BufferedReader postfixReader = new BufferedReader(\n        new InputStreamReader(new ByteArrayInputStream(postfix.toByteArray()),\n            StandardCharsets.UTF_8));\n\n    readWholeDataFromReader(prefixReader, result);\n    readWholeDataFromReader(normalReader, result);\n    readWholeDataFromReader(postfixReader, result);\n\n    try {\n      if (etalonList != null) {\n        assertEqualsStringLists(etalonList, result);\n      }\n    } catch (Exception unexpected) {\n      int index = 1;\n      for (final String str : etalonList) {\n        System.out.print(index++);\n        System.out.print('\\t');\n        println(str, true);\n      }\n      System.out.println(\"---------------------\");\n      index = 1;\n      for (final String str : result) {\n        System.out.print(index++);\n        System.out.print('\\t');\n        println(str, true);\n      }\n      throw unexpected;\n    }\n\n    return context;\n\n  }\n\n  private void println(final String str, final boolean showWhitespaces) {\n    for (final char chr : str.toCharArray()) {\n      if (Character.isWhitespace(chr)) {\n        System.out.print(showWhitespaces ? '.' : chr);\n      } else {\n        System.out.print(chr);\n      }\n    }\n    System.out.println();\n  }\n\n  private List<String> parseStringForLines(final String text) throws IOException {\n    if (text == null || text.isEmpty()) {\n      return emptyList();\n    }\n\n    final List<String> preprocessingPart = new ArrayList<>(100);\n    try (final BufferedReader reader = new BufferedReader(new StringReader(text),\n        text.length() * 2)) {\n      while (!Thread.currentThread().isInterrupted()) {\n        final String line = reader.readLine();\n        if (line == null) {\n          break;\n        }\n        preprocessingPart.add(line);\n      }\n    }\n\n    return preprocessingPart;\n  }\n\n  private PreprocessorContext preprocessString(\n      final String text,\n      final List<String> preprocessedText, final PreprocessorExtension ext,\n      final VariablePair... globalVars) throws Exception {\n    final List<String> preprocessingPart = parseStringForLines(text);\n    return internalPreprocessAndMatch(THIS_CLASS_FILE, preprocessingPart,\n        preprocessedText == null ? new ArrayList<>() : preprocessedText, null, ext, null, false,\n        false,\n        null,\n        globalVars);\n  }\n\n  public PreprocessorContext assertFilePreprocessing(\n      final String testFileName,\n      final boolean keepLines,\n      final PreprocessorExtension ext,\n      final PreprocessorLogger logger,\n      final VariablePair... globalVars) throws Exception {\n    return this.assertFilePreprocessing(testFileName, keepLines, false, ext, logger, null,\n        globalVars);\n  }\n\n  public PreprocessorContext assertFilePreprocessing(final String testFileName, boolean keepLines,\n                                                     boolean allowsBlocks,\n                                                     final PreprocessorExtension ext,\n                                                     final PreprocessorLogger logger,\n                                                     final Consumer<PreprocessorContext> contextTuner,\n                                                     final VariablePair... globalVars)\n      throws Exception {\n    final File file = new File(getClass().getResource(testFileName).toURI());\n\n    if (!file.exists() || !file.isFile()) {\n      throw new FileNotFoundException(\"Can't find the test file \" + testFileName);\n    }\n\n    final InputStream stream = new FileInputStream(file);\n\n    final List<String> preprocessingPart = new ArrayList<>(100);\n    final List<String> etalonPart = new ArrayList<>(100);\n\n    boolean readFirestPart = true;\n    try (final BufferedReader reader = new BufferedReader(\n        new InputStreamReader(stream, StandardCharsets.UTF_8), 1024)) {\n      while (!Thread.currentThread().isInterrupted()) {\n        final String line = reader.readLine();\n        if (line == null) {\n          break;\n        }\n\n        if (line.startsWith(\"---START_ETALON---\")) {\n          if (readFirestPart) {\n            readFirestPart = false;\n            continue;\n          } else {\n            throw new IllegalStateException(\"Check etalon prefix for duplication\");\n          }\n        }\n\n        if (readFirestPart) {\n          preprocessingPart.add(line);\n        } else {\n          etalonPart.add(line);\n        }\n      }\n    }\n\n    return internalPreprocessAndMatch(file, preprocessingPart, new ArrayList<>(), etalonPart, ext,\n        logger, keepLines, allowsBlocks, contextTuner, globalVars);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/AbstractDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertFalse;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class AbstractDirectiveHandlerTest {\n\n  @Test\n  public void testPotentialConflictsBetweenDirectives() {\n    final List<String> processed = new ArrayList<>();\n    for (final AbstractDirectiveHandler h : AbstractDirectiveHandler.findAllDirectives()) {\n      final String name = h.getName();\n      for (final String p : processed) {\n        assertFalse(\n            h.getFullName() + \" conflicts with \" + (AbstractDirectiveHandler.DIRECTIVE_PREFIX + p),\n            name.startsWith(p));\n      }\n      processed.add(name);\n    }\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/ActionDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.ArgumentMatchers.anyInt;\nimport static org.mockito.ArgumentMatchers.anyList;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.any;\nimport static org.mockito.Mockito.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport java.util.List;\nimport org.junit.Test;\nimport org.mockito.Mockito;\n\npublic class ActionDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final ActionDirectiveHandler HANDLER = new ActionDirectiveHandler();\n\n  @Test\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorExtension mockup = mock(PreprocessorExtension.class);\n    when(mockup.hasUserFunction(anyString(), any())).thenReturn(true);\n    when(mockup.hasAction(anyInt())).thenReturn(true);\n    when(mockup.isAllowed(any())).thenReturn(true);\n    when(mockup.processAction(any(PreprocessorContext.class), anyList())).thenReturn(\n        Boolean.TRUE);\n\n    assertFilePreprocessing(\"directive_action.txt\", false, mockup, null);\n\n    final Value val1 = Value.valueOf(1L);\n    final Value val2 = Value.valueOf(2L);\n    final Value val3 = Value.valueOf(7L);\n    final Value val4 = Value.valueOf(11L);\n    final Value val5 = Value.valueOf(Boolean.TRUE);\n    final Value val6 = Value.valueOf(\"hello,\");\n\n    verify(mockup).processAction(any(PreprocessorContext.class),\n        eq(List.of(val1, val2, val3, val4, val5, val6)));\n  }\n\n  @Test\n  public void testExecutionWrongExpression() {\n    final PreprocessorExtension mock = Mockito.mock(PreprocessorExtension.class);\n\n    assertPreprocessorException(\"\\n//#action\", 2, mock);\n    assertPreprocessorException(\"\\n//#action illegal_variable\", 2, mock);\n    assertPreprocessorException(\"\\n//#actionno_space\", 2, mock);\n    assertPreprocessorException(\"\\n//#action 1,2,3,4,,5\", 2, mock);\n    assertPreprocessorException(\"\\n//#action 1,2,3,4,\", 2, mock);\n  }\n\n  @Test\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"action\", HANDLER.getName());\n  }\n\n  @Test\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Test\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.MULTI_EXPRESSION, HANDLER.getArgumentType());\n  }\n\n  @Test\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/CommentNextLineDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic class CommentNextLineDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final CommentNextLineDirectiveHandler HANDLER =\n      new CommentNextLineDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_comment_next_line.txt\", false, null, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"//\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.NONE, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/DefineDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport org.junit.Test;\n\npublic class DefineDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final DefineDirectiveHandler HANDLER = new DefineDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertTrue(assertFilePreprocessing(\"directive_define.txt\", false, null, null).isGlobalVariable(\n        \"somevar\"));\n\n  }\n\n  @Test\n  public void testExecution_wrongCases() {\n    assertPreprocessorException(\"\\n\\n//#define \\n\", 3, null);\n    assertPreprocessorException(\"\\n\\n//#define 1223\\n\", 3, null);\n    assertPreprocessorException(\"\\n\\n//#define \\\"test\\\"\\n\", 3, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"define\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.TAIL, HANDLER.getArgumentType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/DefinelDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport org.junit.Test;\n\npublic class DefinelDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final DefinelDirectiveHandler HANDLER = new DefinelDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertTrue(assertFilePreprocessing(\"directive_definel.txt\", false, null, null).isLocalVariable(\n        \"somevar\"));\n  }\n\n  @Test\n  public void testExecution_wrongCases() {\n    assertPreprocessorException(\"\\n\\n//#definel \\n\", 3, null);\n    assertPreprocessorException(\"\\n\\n//#definel 1223\\n\", 3, null);\n    assertPreprocessorException(\"\\n\\n//#definel \\\"test\\\"\\n\", 3, null);\n    assertPreprocessorException(\"\\n\\n//#definel var 3*8 \\\\\\\\ test \\n\", 3, null);\n    assertPreprocessorException(\"\\n\\n//#definel var 3*8  /* hhhh */ \\n\", 3, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"definel\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.TAIL, HANDLER.getArgumentType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/EchoDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport org.mockito.Mockito;\n\npublic class EchoDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final EchoDirectiveHandler HANDLER = new EchoDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorLogger mock = Mockito.mock(PreprocessorLogger.class);\n    assertFilePreprocessing(\"directive_echo.txt\", false, null, mock);\n    Mockito.verify(mock).info(\"string 2 ok\");\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"echo\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.TAIL, HANDLER.getArgumentType());\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/ErrorDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport org.junit.Test;\nimport org.mockito.Mockito;\n\npublic class ErrorDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final ErrorDirectiveHandler HANDLER = new ErrorDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorLogger mock = Mockito.mock(PreprocessorLogger.class);\n    try {\n      assertFilePreprocessing(\"directive_error.txt\", false, null, mock);\n    } catch (Exception ex) {\n      Mockito.verify(mock).error(\"string2\");\n      final PreprocessorException pp = PreprocessorException.extractPreprocessorException(ex);\n      assertEquals(3, pp.getIncludeChain()[0].getLineNumber());\n    }\n  }\n\n  @Test\n  public void testExecution_wrongCases() {\n    assertPreprocessorException(\"\\n\\n//#error 324444444444987987987982374987294873294324324\\n\", 3,\n        null);\n    assertPreprocessorException(\"\\n\\n//#error sjdasd\\n\", 3, null);\n    assertPreprocessorException(\"\\n\\n//#error \\n\", 3, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"error\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.EXPRESSION, HANDLER.getArgumentType());\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/ExcludeIfDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.context.PreprocessingState.ExcludeIfInfo;\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class ExcludeIfDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final ExcludeIfDirectiveHandler HANDLER = new ExcludeIfDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    final List<ExcludeIfInfo> list = new ArrayList<>();\n    executeGlobalPhase(\"directive_excludeif.txt\", list);\n    assertEquals(\"Must be two //#excludeif \", list.size(), 2);\n    final ExcludeIfInfo info1 = list.get(1);\n    final ExcludeIfInfo info2 = list.get(0);\n\n    assertEquals(\"true\", info1.getCondition());\n    assertEquals(2, info1.getStringIndex());\n    assertNotNull(info1.getFileInfoContainer());\n\n    assertEquals(\"hello+world\", info2.getCondition());\n    assertEquals(6, info2.getStringIndex());\n    assertNotNull(info2.getFileInfoContainer());\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"excludeif\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER.isGlobalPhaseAllowed());\n    assertFalse(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.BOOLEAN, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/ExitDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic class ExitDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final ExitDirectiveHandler HANDLER = new ExitDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_exit.txt\", false, null, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"exit\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.NONE, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/ExitIfDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport org.junit.Test;\n\npublic class ExitIfDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final ExitIfDirectiveHandler HANDLER = new ExitIfDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_exitif.txt\", false, null, null);\n  }\n\n  @Test\n  public void testExecution_wrongExpression() {\n    assertPreprocessorException(\"\\n\\n //#exitif \\\"test\\\"\", 3, null);\n    assertPreprocessorException(\"\\n\\n //#exitif \", 3, null);\n    assertPreprocessorException(\"\\n\\n //#exitif 111\", 3, null);\n    assertPreprocessorException(\"\\n\\n //#exitif\", 3, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"exitif\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.BOOLEAN, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/FlushDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic class FlushDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final FlushDirectiveHandler HANDLER = new FlushDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    //TODO make execution test\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"flush\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.NONE, HANDLER.getArgumentType());\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/GlobalDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNull;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport org.junit.Test;\n\npublic class GlobalDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final GlobalDirectiveHandler HANDLER = new GlobalDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext context = executeGlobalPhase(\"directive_global.txt\", null);\n    assertTrue(context.containsGlobalVariable(\"xxx\"));\n    final Value var = context.findVariableForName(\"xxx\", true);\n    assertEquals(Long.valueOf(10), var.asLong());\n  }\n\n  @Test\n  public void testExecution_PreprocessingPhase() throws Exception {\n    final PreprocessorContext context =\n        assertFilePreprocessing(\"directive_global.txt\", false, null, null);\n    assertFalse(context.containsGlobalVariable(\"xxx\"));\n    assertNull(context.findVariableForName(\"xxx\", true));\n  }\n\n  @Test\n  public void testExecution_WrongCases() throws Exception {\n    assertGlobalPhaseException(\"\\n\\n//#global 23123\", 3, null);\n    assertGlobalPhaseException(\"\\n\\n//#global\", 3, null);\n    assertGlobalPhaseException(\"\\n\\n//#global \", 3, null);\n    assertGlobalPhaseException(\"\\n\\n//#global hh=\", 3, null);\n    assertGlobalPhaseException(\"\\n\\n//#global xx==10\", 3, null);\n    assertGlobalPhaseException(\"\\n\\n//#global =10\", 3, null);\n    assertGlobalPhaseException(\"\\n\\n//#global ====\", 3, null);\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"global\", HANDLER.getName());\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER.isGlobalPhaseAllowed());\n    assertFalse(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.SET, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/GlobalIfElseEndifTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport org.junit.Test;\n\npublic class GlobalIfElseEndifTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final GlobalIfDirectiveHandler HANDLER_GLOBAL_IF = new GlobalIfDirectiveHandler();\n  private static final GlobalElseDirectiveHandler HANDLER_GLOBAL_ELSE =\n      new GlobalElseDirectiveHandler();\n  private static final GlobalEndIfDirectiveHandler HANDLER_GLOBAL_ENDIF =\n      new GlobalEndIfDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext context = executeGlobalPhase(\"directive_globalifelseendif.txt\", null);\n    assertTrue(context.containsGlobalVariable(\"expected\"));\n    assertFalse(context.containsGlobalVariable(\"unexpected\"));\n    assertEquals(Boolean.TRUE, context.findVariableForName(\"expected\", true).asBoolean());\n  }\n\n  @Test\n  public void testExecution_PreprocessingPhase() throws Exception {\n    assertFilePreprocessing(\"directive_globalifelseendif.txt\", false, null, null);\n    assertFilePreprocessing(\"directive_globalifelseendif2.txt\", false, null, null);\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertGlobalPhaseException(\"\\n//#_if true\", 2, null);\n    assertGlobalPhaseException(\"\\n//#_if true\\n//#_else\", 2, null);\n    assertGlobalPhaseException(\"\\n//#_if true\\n//#_if true\\n//#_else\\n//#_endif\", 2, null);\n    assertGlobalPhaseException(\"\\n//#_if true\\n//#_if 111\\n//#_else\\n//#_endif\", 3, null);\n    assertGlobalPhaseException(\"\\n//#_endif\", 2, null);\n    assertGlobalPhaseException(\"\\n//#_else\", 2, null);\n    assertGlobalPhaseException(\"\\n//#_else\\n//#_endif\", 2, null);\n    assertGlobalPhaseException(\"\\n//#_if xxx\\n//#_endif\", 2, null);\n    assertGlobalPhaseException(\"\\n//#global xxx=1\\n//#_if xxx\\n//#_endif\", 3, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"_if\", HANDLER_GLOBAL_IF.getName());\n    assertEquals(\"_else\", HANDLER_GLOBAL_ELSE.getName());\n    assertEquals(\"_endif\", HANDLER_GLOBAL_ENDIF.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertFalse(HANDLER_GLOBAL_IF.executeOnlyWhenExecutionAllowed());\n    assertFalse(HANDLER_GLOBAL_ELSE.executeOnlyWhenExecutionAllowed());\n    assertFalse(HANDLER_GLOBAL_ENDIF.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER_GLOBAL_IF);\n    assertReference(HANDLER_GLOBAL_ELSE);\n    assertReference(HANDLER_GLOBAL_ENDIF);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER_GLOBAL_IF.isGlobalPhaseAllowed());\n    assertFalse(HANDLER_GLOBAL_IF.isPreprocessingPhaseAllowed());\n\n    assertTrue(HANDLER_GLOBAL_ELSE.isGlobalPhaseAllowed());\n    assertFalse(HANDLER_GLOBAL_ELSE.isPreprocessingPhaseAllowed());\n\n    assertTrue(HANDLER_GLOBAL_ENDIF.isGlobalPhaseAllowed());\n    assertFalse(HANDLER_GLOBAL_ENDIF.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.BOOLEAN, HANDLER_GLOBAL_IF.getArgumentType());\n    assertEquals(DirectiveArgumentType.NONE, HANDLER_GLOBAL_ELSE.getArgumentType());\n    assertEquals(DirectiveArgumentType.NONE, HANDLER_GLOBAL_ENDIF.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/IfDefDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic class IfDefDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final IfDefDirectiveHandler HANDLER = new IfDefDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_ifdef.txt\", false, null, null,\n        new VariablePair(\"BYTECODE\", \"true\"));\n\n    try {\n      assertFilePreprocessing(\"directive_ifdef.txt\", false, null, null);\n    } catch (LinesNotMatchException expected) {\n      assertEquals(\"somebytecode\", expected.getEtalonString());\n      assertEquals(\"end\", expected.getResultString());\n    }\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"ifdef\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertFalse(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.VARNAME, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/IfDefinedDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic class IfDefinedDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final IfDefinedDirectiveHandler HANDLER = new IfDefinedDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    // with defined global var\n    assertFilePreprocessing(\"directive_ifdefined.txt\", false, null, null,\n        new VariablePair(\"BYTECODE\", \"true\"));\n\n    // with non-defined global var\n    try {\n      assertFilePreprocessing(\"directive_ifdefined.txt\", false, null, null);\n    } catch (LinesNotMatchException expected) {\n      assertEquals(\"somebytecode\", expected.getEtalonString());\n      assertEquals(\"end\", expected.getResultString());\n    }\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"ifdefined\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertFalse(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.VARNAME, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/IfElseEndifDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport org.junit.Test;\n\npublic class IfElseEndifDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final IfDirectiveHandler IF_HANDLER = new IfDirectiveHandler();\n  private static final ElseDirectiveHandler ELSE_HANDLER = new ElseDirectiveHandler();\n  private static final EndIfDirectiveHandler ENDIF_HANDLER = new EndIfDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_if_else_endif.txt\", false, null, null);\n  }\n\n  @Test\n  public void testIf_ExceptionWithoutExpression() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n   \\n  //#if   \\ntest\\n  //#endif\", 5, null);\n    assertPreprocessorException(\"\\n\\n\\n   \\n  //#if\\ntest\\n  //#endif\", 5, null);\n  }\n\n  @Test\n  public void testIf_ExceptionWithoutEndIf() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n   \\n  //#if true\\n\\n\", 5, null);\n    assertPreprocessorException(\"\\n\\n\\n   \\n  //#if true\\n//#if true\\n//#endif\\n\", 5, null);\n  }\n\n  @Test\n  public void testElse_ExeptionWithoutIf() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n   \\n  //#else  \\ntest\\n  //#endif\", 5, null);\n  }\n\n  @Test\n  public void testEndIf_ExceptionWithoutIf() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n   \\n  //#endif\", 5, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"if\", IF_HANDLER.getName());\n    assertEquals(\"else\", ELSE_HANDLER.getName());\n    assertEquals(\"endif\", ENDIF_HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertFalse(IF_HANDLER.executeOnlyWhenExecutionAllowed());\n    assertFalse(ELSE_HANDLER.executeOnlyWhenExecutionAllowed());\n    assertFalse(ENDIF_HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(IF_HANDLER);\n    assertReference(ELSE_HANDLER);\n    assertReference(ENDIF_HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(IF_HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(IF_HANDLER.isGlobalPhaseAllowed());\n    assertTrue(ELSE_HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(ELSE_HANDLER.isGlobalPhaseAllowed());\n    assertTrue(ENDIF_HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(ENDIF_HANDLER.isGlobalPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.BOOLEAN, IF_HANDLER.getArgumentType());\n    assertEquals(DirectiveArgumentType.NONE, ELSE_HANDLER.getArgumentType());\n    assertEquals(DirectiveArgumentType.NONE, ENDIF_HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/IfElseEndifDirectiveWithKeepLinesHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertNotNull;\n\npublic class IfElseEndifDirectiveWithKeepLinesHandlerTest extends IfElseEndifDirectiveHandlerTest {\n\n  @Override\n  public void testExecution() throws Exception {\n    assertNotNull(new IfDirectiveHandler());\n    assertNotNull(new ElseDirectiveHandler());\n    assertNotNull(new EndIfDirectiveHandler());\n\n    assertFilePreprocessing(\"directive_if_else_endif_with_keptlines.txt\", true, null, null);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/IfNDefDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic class IfNDefDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final IfNDefDirectiveHandler HANDLER = new IfNDefDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_ifndef.txt\", false, null, null);\n\n    try {\n      assertFilePreprocessing(\"directive_ifndef.txt\", false, null, null,\n          new VariablePair(\"BYTECODE\", \"123\"));\n    } catch (LinesNotMatchException expected) {\n      assertEquals(\"somebytecode\", expected.getEtalonString());\n      assertEquals(\"end\", expected.getResultString());\n    }\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"ifndef\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertFalse(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.VARNAME, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/IncludeDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport org.junit.Test;\n\npublic class IncludeDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final IncludeDirectiveHandler HANDLER = new IncludeDirectiveHandler();\n\n  @Test\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext context =\n        assertFilePreprocessing(\"directive_include.txt\", false, null, null);\n    assertEquals(3, context.findAllInputFiles().size());\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n//#include 111\\n\", 4, null);\n    assertPreprocessorException(\"\\n\\n\\n//#include\\n\", 4, null);\n    assertPreprocessorException(\"\\n\\n\\n//#include \\n\", 4, null);\n    assertPreprocessorException(\"\\n\\n\\n//#include =\\n\", 4, null);\n    assertPreprocessorException(\"\\n\\n\\n//#include=\\n\", 4, null);\n    assertPreprocessorException(\"\\n\\n\\n//#include333\\n\", 4, null);\n    assertPreprocessorException(\"\\n\\n\\n//#include true\\n\", 4, null);\n    assertPreprocessorException(\"\\n\\n\\n//#include \\\"/some/nonexist/absolutnonexist/file.ttxt\\\"\\n\",\n        4, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"include\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.STRING, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/LinesNotMatchException.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\npublic class LinesNotMatchException extends RuntimeException {\n\n  private static final long serialVersionUID = 0x129894723894A123L;\n\n  private final int etalonLineNumber;\n  private final int resultLineNumber;\n  private final int problemStringIndex;\n  private final String etalonString;\n  private final String resultString;\n\n  public LinesNotMatchException(final int etalonLineNumber, final int resultLineNumber,\n                                final int problemStringIndex, final String etalonString,\n                                final String resultString) {\n    super(\"Lines not match in the etalon and the result\");\n    this.etalonLineNumber = etalonLineNumber;\n    this.resultLineNumber = resultLineNumber;\n    this.etalonString = etalonString;\n    this.resultString = resultString;\n    this.problemStringIndex = problemStringIndex;\n  }\n\n  public int getProblemStringIndex() {\n    return this.problemStringIndex;\n  }\n\n  public int getEtalonLineNumber() {\n    return this.etalonLineNumber;\n  }\n\n  public int getResultLineNumber() {\n    return this.resultLineNumber;\n  }\n\n  public String getEtalonString() {\n    return this.etalonString;\n  }\n\n  public String getResultString() {\n    return this.resultString;\n  }\n\n  @Override\n  public String toString() {\n    return LinesNotMatchException.class.getName() + \"(etalonLineNum=\" + this.etalonLineNumber\n        + \",resultLineNum=\" + this.resultLineNumber\n        + \",problemLine=\" + (this.problemStringIndex + 1)\n        + \",etalonString=\" + this.etalonString\n        + \",resultString=\" + this.resultString\n        + ')';\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/LocalDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport org.junit.Test;\n\npublic class LocalDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final LocalDirectiveHandler HANDLER = new LocalDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext context =\n        assertFilePreprocessing(\"directive_local.txt\", false, null, null);\n\n    assertEquals(Long.valueOf(5), context.getLocalVariable(\"x\").asLong());\n    assertEquals(Long.valueOf(10), context.getLocalVariable(\"y\").asLong());\n    assertEquals(Long.valueOf(15), context.getLocalVariable(\"z\").asLong());\n    assertEquals(\"\", context.getLocalVariable(\"l_stringgamesNumber\").asString());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Test\n  public void testExecution_ExceptionOnExpressionAbsence() {\n    assertPreprocessorException(\"1\\n2\\n   //#local \\n3 \", 3, null);\n    assertPreprocessorException(\"1\\n2\\n   //#local\\n3   \", 3, null);\n  }\n\n  @Test\n  public void testExecution_ExceptionOnWrongExpression() {\n    assertPreprocessorException(\"1\\n2\\n   //#local 3\\n3  \", 3, null);\n    assertPreprocessorException(\"1\\n2\\n   //#local a=\\n3\", 3, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"local\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.SET, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/MsgDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\n\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport java.util.List;\nimport org.mockito.ArgumentCaptor;\n\npublic class MsgDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final MsgDirectiveHandler HANDLER = new MsgDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorLogger mock = mock(PreprocessorLogger.class);\n    assertFilePreprocessing(\"directive_msg.txt\", false, null, mock);\n\n    ArgumentCaptor<String> varArgs = ArgumentCaptor.forClass(String.class);\n    verify(mock, times(2)).info(varArgs.capture());\n    final List<String> calls = varArgs.getAllValues();\n    assertEquals(2, calls.size());\n    assertEquals(\"  string 2 ok  \", calls.get(0));\n    assertEquals(\"string 48 ok\", calls.get(1));\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"msg\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.TAIL, HANDLER.getArgumentType());\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/NoAutoFlushDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic class NoAutoFlushDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final NoAutoFlushHandler HANDLER = new NoAutoFlushHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    //TODO make execution test\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"noautoflush\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.NONE, HANDLER.getArgumentType());\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/OnlySpacesTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\npublic class OnlySpacesTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"only_spaces.txt\", true, null, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n  }\n\n  @Override\n  public void testReference() throws Exception {\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/OutDisabledDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic class OutDisabledDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final OutDisabledDirectiveHandler HANDLER = new OutDisabledDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_outdisabled.txt\", false, null, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"-\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.NONE, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/OutEnabledDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic class OutEnabledDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final OutEnabledDirectiveHandler HANDLER = new OutEnabledDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_outenabled.txt\", false, null, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"+\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.NONE, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/OutNameDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport org.junit.Test;\n\npublic class OutNameDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final OutNameDirectiveHandler HANDLER = new OutNameDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_outname.txt\", false, null, null);\n  }\n\n  @Test\n  public void testExecution_wrongExpressionResult() {\n    assertPreprocessorException(\"\\n//#outname\", 2, null);\n    assertPreprocessorException(\"\\n//#outname 882772  k\", 2, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"outname\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.STRING, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/OutdirDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport org.junit.Test;\n\npublic class OutdirDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final OutdirDirectiveHandler HANDLER = new OutdirDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_outdir.txt\", false, null, null);\n  }\n\n  @Test\n  public void testExecution_wrongExpression() {\n    assertPreprocessorException(\"\\n //#outdir\", 2, null);\n    assertPreprocessorException(\"\\n //#outdir \", 2, null);\n    assertPreprocessorException(\"\\n //#outdir 234324 8\", 2, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"outdir\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.STRING, HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/PrefixPostfixDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport org.junit.Test;\n\npublic class PrefixPostfixDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final PrefixDirectiveHandler HANDLER_PREFIX = new PrefixDirectiveHandler();\n  private static final PostfixDirectiveHandler HANDLER_POSTFIX = new PostfixDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_prefixpostfix.txt\", false, null, null);\n  }\n\n  @Test\n  public void testPrefix_wrongArgument() {\n    assertPreprocessorException(\"\\n    //#prefix -\", 2, null);\n    assertPreprocessorException(\"\\n    //#prefix-1\", 2, null);\n    assertPreprocessorException(\"\\n //#prefixa\", 2, null);\n  }\n\n  @Test\n  public void testPostfix_wrongArgument() {\n    assertPreprocessorException(\"\\n   //#postfix -\", 2, null);\n    assertPreprocessorException(\"\\n //#postfix1\", 2, null);\n    assertPreprocessorException(\"\\n //#postfix+q\", 2, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"prefix\", HANDLER_PREFIX.getName());\n    assertEquals(\"postfix\", HANDLER_POSTFIX.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER_PREFIX.executeOnlyWhenExecutionAllowed());\n    assertTrue(HANDLER_POSTFIX.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER_PREFIX);\n    assertReference(HANDLER_POSTFIX);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER_POSTFIX.isPreprocessingPhaseAllowed());\n    assertFalse(HANDLER_POSTFIX.isGlobalPhaseAllowed());\n    assertTrue(HANDLER_PREFIX.isPreprocessingPhaseAllowed());\n    assertFalse(HANDLER_PREFIX.isGlobalPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.ON_OFF, HANDLER_POSTFIX.getArgumentType());\n    assertEquals(DirectiveArgumentType.ON_OFF, HANDLER_PREFIX.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/SpecVarsROTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport org.mockito.Mockito;\n\n/**\n * Test for special read only predefined variables\n */\npublic class SpecVarsROTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorLogger mock = Mockito.mock(PreprocessorLogger.class);\n    assertFilePreprocessing(\"specvars_ro.txt\", false, null, mock);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n  }\n\n  @Override\n  public void testReference() throws Exception {\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/SpecialDirectivesBlockTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.context.CommentTextProcessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.FilePositionInfo;\nimport java.util.Arrays;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.stream.Collectors;\n\n// This test checks work of //$$\"\"\", //$\"\"\"\n// Those directives are very specific and they don't have any distinguished handler\npublic class SpecialDirectivesBlockTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  @Override\n  public void testExecution() throws Exception {\n    final StringBuilder calledForText = new StringBuilder();\n\n    final AtomicBoolean started = new AtomicBoolean();\n    final AtomicBoolean stopped = new AtomicBoolean();\n\n    final CommentTextProcessor testProcessor = new CommentTextProcessor() {\n      @Override\n      public void onContextStarted(PreprocessorContext context) {\n        if (!started.compareAndSet(false, true)) {\n          fail();\n        }\n      }\n\n      @Override\n      public void onContextStopped(PreprocessorContext context, Throwable error) {\n        if (!stopped.compareAndSet(false, true)) {\n          fail();\n        }\n      }\n\n      @Override\n      public boolean isAllowed(PreprocessorContext context) {\n        return true;\n      }\n\n      @Override\n      public String processUncommentedText(PreprocessorContext context, int recommendedIndent,\n                                           String uncommentedText) {\n        final FilePositionInfo positionInfo =\n            context.getPreprocessingState().findFilePositionInfo().orElseThrow();\n        assertTrue(positionInfo.getLineNumber() >= 0);\n        assertNotNull(uncommentedText);\n        assertNotNull(context);\n\n        calledForText.append(\"\\n...\\n\").append(uncommentedText);\n\n        final String indent = context.isPreserveIndents() ? \" \".repeat(recommendedIndent) : \"\";\n\n        return Arrays.stream(uncommentedText.split(\"\\\\R\"))\n            .map(x -> indent + x)\n            .collect(Collectors.joining(context.getEol()));\n      }\n    };\n\n    assertFilePreprocessing(\"directive_special_block.txt\", false, true, null, null,\n        c -> {\n          c.setPreserveIndents(true);\n          c.addCommentTextProcessor(testProcessor);\n        });\n    assertTrue(started.get());\n    assertTrue(stopped.get());\n    assertEquals(\"\\n...\\n\" +\n            \"      hello 223 world\\n\" +\n            \"      next\" +\n            \"\\n...\\n\" +\n            \"       hello /*$111+112$*/ world\\n\" +\n            \"       next/*$111+112$*/\" +\n            \"\\n...\\n\" +\n            \"       hello /*$111+112$*/ world\\n\" +\n            \"      middle\\n\" +\n            \"       next/*$111+112$*/\" +\n            \"\\n...\\n\" +\n            \"       hello /*$111+112$*/ world\" +\n            \"\\n...\\n\" +\n            \"   split\" +\n            \"\\n...\\n\" +\n            \"       next/*$111+112$*/\" +\n            \"\\n...\\n\" +\n            \"      hello 223 world\" +\n            \"\\n...\\n\" +\n            \"    split\" +\n            \"\\n...\\n\" +\n            \"      next223\" +\n            \"\\n...\\n\" +\n            \"      line1\" +\n            \"\\n...\\n\" +\n            \"      line2\" +\n            \"\\n...\\n\" +\n            \"      hello\\n\" +\n            \"      world earth\"\n        , calledForText.toString());\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    // do nothing because it is a group test\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    // do nothing because it is a group test\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    // do nothing because it is a group test\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    // do nothing because it is a group test\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    // do nothing because it is a group test\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/SpecialDirectivesTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.context.CommentTextProcessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\n// This test checks work of //$$, //$ and /*-*/\n// Those directives are very specific and they don't have any distinguished handler\npublic class SpecialDirectivesTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  @Override\n  public void testExecution() throws Exception {\n    final StringBuilder calledForText = new StringBuilder();\n\n    final AtomicBoolean started = new AtomicBoolean();\n    final AtomicBoolean stopped = new AtomicBoolean();\n\n    final CommentTextProcessor testProcessor = new CommentTextProcessor() {\n      @Override\n      public void onContextStarted(PreprocessorContext context) {\n        if (!started.compareAndSet(false, true)) {\n          fail();\n        }\n      }\n\n      @Override\n      public void onContextStopped(PreprocessorContext context, Throwable error) {\n        if (!stopped.compareAndSet(false, true)) {\n          fail();\n        }\n      }\n\n      @Override\n      public boolean isAllowed(PreprocessorContext context) {\n        return true;\n      }\n\n      @Override\n      public String processUncommentedText(PreprocessorContext context, int recommendedIndent,\n                                           String uncommentedText) {\n        assertNotNull(uncommentedText);\n        assertNotNull(context);\n\n        calledForText.append(\"\\n...\\n\").append(uncommentedText);\n\n        return uncommentedText;\n      }\n    };\n\n    assertFilePreprocessing(\"directive_special.txt\", false, false, null, null,\n        c -> c.addCommentTextProcessor(testProcessor));\n    assertTrue(started.get());\n    assertTrue(stopped.get());\n    assertEquals(\"\\n...\\n\" +\n        \"hello 223 world\" +\n        \"\\n...\\n\" +\n        \"hello /*$111+112$*/ world\" +\n        \"\\n...\\n\" +\n        \"\\\"\\\"\\\"hello 223 world\" +\n        \"\\n...\\n\" +\n        \"\\\"\\\"\\\"hello /*$111+112$*/ world\", calledForText.toString());\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    // do nothing because it is a group test\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    // do nothing because it is a group test\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    // do nothing because it is a group test\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    // do nothing because it is a group test\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    // do nothing because it is a group test\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/UndefDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport org.junit.Test;\n\npublic class UndefDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final UndefDirectiveHandler HANDLER = new UndefDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorContext context =\n        assertFilePreprocessing(\"directive_undef.txt\", false, null, null,\n            new VariablePair(\"somevar\", \"true\"));\n    assertFalse(context.isGlobalVariable(\"somevar\"));\n    assertFalse(context.isLocalVariable(\"localone\"));\n  }\n\n  @Test\n  public void testExecution_wrongCases() {\n    assertPreprocessorException(\"\\n\\n//#undef \\n\", 3, null);\n    assertPreprocessorException(\"\\n\\n//#undef 1223\\n\", 3, null);\n    assertPreprocessorException(\"\\n\\n//#undef \\\"test\\\"\\n\", 3, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"undef\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.TAIL, HANDLER.getArgumentType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/VariablePair.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class VariablePair {\n\n  private final String name;\n  private final Value value;\n\n  public VariablePair(final String name, final String value) {\n    this.name = name;\n    this.value = Value.recognizeOf(value);\n  }\n\n  public String getName() {\n    return this.name;\n  }\n\n  public Value getValue() {\n    return this.value;\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/WarningDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.logger.PreprocessorLogger;\nimport org.junit.Test;\nimport org.mockito.Mockito;\n\npublic class WarningDirectiveHandlerTest extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final WarningDirectiveHandler HANDLER = new WarningDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    final PreprocessorLogger mock = Mockito.mock(PreprocessorLogger.class);\n    assertFilePreprocessing(\"directive_warning.txt\", false, null, mock);\n    Mockito.verify(mock).warning(\"string2\");\n  }\n\n  @Test\n  public void testExecution_wrongCases() {\n    assertPreprocessorException(\"\\n\\n//#warning 324444444444987987987982374987294873294324324\\n\", 3,\n        null);\n    assertPreprocessorException(\"\\n\\n//#warning sjdasd\\n\", 3, null);\n    assertPreprocessorException(\"\\n\\n//#warning \\n\", 3, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"warning\", HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertTrue(HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.EXPRESSION, HANDLER.getArgumentType());\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertTrue(HANDLER.isPreprocessingPhaseAllowed());\n    assertFalse(HANDLER.isGlobalPhaseAllowed());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/directives/WhileContinueBreakEndDirectiveHandlerTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.directives;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport org.junit.Test;\n\npublic class WhileContinueBreakEndDirectiveHandlerTest\n    extends AbstractDirectiveHandlerAcceptanceTest {\n\n  private static final WhileDirectiveHandler WHILE_HANDLER = new WhileDirectiveHandler();\n  private static final ContinueDirectiveHandler CONTINUE_HANDLER = new ContinueDirectiveHandler();\n  private static final BreakDirectiveHandler BREAK_HANDLER = new BreakDirectiveHandler();\n  private static final EndDirectiveHandler END_HANDLER = new EndDirectiveHandler();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertFilePreprocessing(\"directive_while_continue_break_end.txt\", false, null, null);\n  }\n\n  @Test\n  public void testWhile_ExceptionWithoutExpression() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n   \\n\\n  //#while   \\ntest\\n  //#end\", 6, null);\n  }\n\n  @Test\n  public void testWhile_ExceptionForNonBooleanExpression() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n   \\n\\n  //#while 234  \\ntest\\n  //#end\", 6, null);\n  }\n\n  @Test\n  public void testWhile_ExceptionForNonClosed() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n   \\n\\n  //#while true  \\ntest\\n\", 6, null);\n  }\n\n  @Test\n  public void testBreak_ExceptionWithoutWhile() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n   \\n\\n  //#break \\ntest\\n\", 6, null);\n  }\n\n  @Test\n  public void testContinue_ExceptionWithoutWhile() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n   \\n\\n  //#continue \\ntest\\n\", 6, null);\n  }\n\n  @Test\n  public void testEnd_ExceptionWithoutWhile() throws Exception {\n    assertPreprocessorException(\"\\n\\n\\n   \\n\\n  //#end \\ntest\\n\", 6, null);\n  }\n\n  @Override\n  public void testKeyword() throws Exception {\n    assertEquals(\"while\", WHILE_HANDLER.getName());\n    assertEquals(\"break\", BREAK_HANDLER.getName());\n    assertEquals(\"continue\", CONTINUE_HANDLER.getName());\n    assertEquals(\"end\", END_HANDLER.getName());\n  }\n\n  @Override\n  public void testExecutionCondition() throws Exception {\n    assertFalse(WHILE_HANDLER.executeOnlyWhenExecutionAllowed());\n    assertTrue(BREAK_HANDLER.executeOnlyWhenExecutionAllowed());\n    assertTrue(CONTINUE_HANDLER.executeOnlyWhenExecutionAllowed());\n    assertFalse(END_HANDLER.executeOnlyWhenExecutionAllowed());\n  }\n\n  @Override\n  public void testReference() throws Exception {\n    assertReference(WHILE_HANDLER);\n    assertReference(BREAK_HANDLER);\n    assertReference(CONTINUE_HANDLER);\n    assertReference(END_HANDLER);\n  }\n\n  @Override\n  public void testPhase() throws Exception {\n    assertFalse(WHILE_HANDLER.isGlobalPhaseAllowed());\n    assertFalse(BREAK_HANDLER.isGlobalPhaseAllowed());\n    assertFalse(CONTINUE_HANDLER.isGlobalPhaseAllowed());\n    assertFalse(END_HANDLER.isGlobalPhaseAllowed());\n\n    assertTrue(WHILE_HANDLER.isPreprocessingPhaseAllowed());\n    assertTrue(BREAK_HANDLER.isPreprocessingPhaseAllowed());\n    assertTrue(CONTINUE_HANDLER.isPreprocessingPhaseAllowed());\n    assertTrue(END_HANDLER.isPreprocessingPhaseAllowed());\n  }\n\n  @Override\n  public void testArgumentType() throws Exception {\n    assertEquals(DirectiveArgumentType.BOOLEAN, WHILE_HANDLER.getArgumentType());\n    assertEquals(DirectiveArgumentType.NONE, BREAK_HANDLER.getArgumentType());\n    assertEquals(DirectiveArgumentType.NONE, CONTINUE_HANDLER.getArgumentType());\n    assertEquals(DirectiveArgumentType.NONE, END_HANDLER.getArgumentType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/exceptions/PreprocessorExceptionTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.exceptions;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.io.File;\nimport java.util.Collections;\nimport java.util.Objects;\nimport org.junit.Test;\n\npublic final class PreprocessorExceptionTest {\n\n  @Test\n  public void testExceptionStringIndex_WrongBracket() throws Exception {\n    final File file = new File(this.getClass().getResource(\"wrong_bracket.txt\").toURI());\n\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    context.setDryRun(true);\n\n    final FileInfoContainer container = new FileInfoContainer(file, \"test\", false);\n    try {\n      container.preprocessFileWithNotification(context, null, true);\n      fail(\"Must throw PreprocessorException\");\n    } catch (PreprocessorException expected) {\n      assertEquals(\"Expected correct line number\", 17, expected.getLineNumber());\n    }\n  }\n\n  @Test\n  public void testExceptionStringIndex_WrongBracketClosing() throws Exception {\n    final File file = new File(\n        Objects.requireNonNull(this.getClass().getResource(\"wrong_bracket_closing.txt\")).toURI());\n\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    context.setDryRun(true);\n\n    final FileInfoContainer container = new FileInfoContainer(file, \"test\", false);\n    try {\n      container.preprocessFileWithNotification(context, null, true);\n      fail(\"Must throw PreprocessorException\");\n    } catch (PreprocessorException expected) {\n      assertEquals(\"Expected correct line number\", 17, expected.getLineNumber());\n    }\n  }\n\n  @Test\n  public void testExceptionStringIndex_WrongBracketInIncluded() throws Exception {\n    final File file = new File(this.getClass().getResource(\"wrong_bracket_include.txt\").toURI());\n\n    final PreprocessorContext context =\n        new PreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    context.setSources(Collections.singletonList(file.getParent()));\n    context.setDryRun(true);\n\n    final FileInfoContainer container = new FileInfoContainer(file, \"test\", false);\n    try {\n      container.preprocessFileWithNotification(context, null, true);\n      fail(\"Must throw PreprocessorException\");\n    } catch (PreprocessorException expected) {\n      final FilePositionInfo[] fileStack = expected.getIncludeChain();\n      assertEquals(\"Must have depth 2\", 2, fileStack.length);\n      assertEquals(\"String index in the including file is 26\", 26, fileStack[1].getLineNumber());\n      assertEquals(\"String index in the wrong bracket file is 15\", 17,\n          fileStack[0].getLineNumber());\n\n      assertEquals(\"Expected correct line number\", 17, expected.getLineNumber());\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/ExpressionParserTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertNull;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.AbstractMockPreprocessorContextTest;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.functions.AbstractFunction;\nimport com.igormaznitsa.jcp.expression.functions.FunctionABS;\nimport com.igormaznitsa.jcp.expression.functions.xml.FunctionXML_ATTR;\nimport com.igormaznitsa.jcp.expression.operators.AbstractOperator;\nimport com.igormaznitsa.jcp.expression.operators.OperatorADD;\nimport com.igormaznitsa.jcp.expression.operators.OperatorDIV;\nimport com.igormaznitsa.jcp.expression.operators.OperatorEQU;\nimport com.igormaznitsa.jcp.expression.operators.OperatorLESS;\nimport com.igormaznitsa.jcp.expression.operators.OperatorMOD;\nimport com.igormaznitsa.jcp.expression.operators.OperatorMUL;\nimport com.igormaznitsa.jcp.expression.operators.OperatorSUB;\nimport java.io.PushbackReader;\nimport java.io.StringReader;\nimport org.junit.Test;\n\npublic class ExpressionParserTest extends AbstractMockPreprocessorContextTest {\n\n  @Test\n  public void testReplacingNegativeNumber() throws Exception {\n    final ExpressionTree tree = new ExpressionTree();\n    final OperatorSUB SUB = AbstractOperator.findForClass(OperatorSUB.class);\n\n    assertNotNull(SUB);\n\n    tree.addItem(SUB);\n    tree.addItem(Value.INT_ONE);\n    tree.addItem(SUB);\n    tree.addItem(Value.INT_TWO);\n\n    tree.postProcess();\n\n    final ExpressionTreeElement root = tree.getRoot();\n\n    assertEquals(\"Root must be SUB\", SUB, root.getItem());\n    assertEquals(\"Left must be -1\", Value.valueOf(-1L), root.getChildForIndex(0).getItem());\n    assertEquals(\"Right must be 2\", Value.INT_TWO, root.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testNextItem_zero() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final PushbackReader reader = new PushbackReader(new StringReader(\"0\"));\n    assertEquals(\"Must be 0\", Value.INT_ZERO,\n        ExpressionParser.getInstance().nextItem(reader, context));\n    assertNull(\"Must be null\", ExpressionParser.getInstance().nextItem(reader, context));\n  }\n\n  @Test\n  public void testNextItem_negativeNumber() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final PushbackReader reader = new PushbackReader(new StringReader(\"-1\"));\n    assertEquals(\"Must be SUB\", AbstractOperator.findForClass(OperatorSUB.class),\n        ExpressionParser.getInstance().nextItem(reader, context));\n    assertEquals(\"Must be 1\", Value.INT_ONE,\n        ExpressionParser.getInstance().nextItem(reader, context));\n    assertNull(\"Must be null\", ExpressionParser.getInstance().nextItem(reader, context));\n  }\n\n  @Test\n  public void testNextItem_zeroLess() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final PushbackReader reader = new PushbackReader(new StringReader(\"0<\"));\n    assertEquals(\"Must be 0\", Value.INT_ZERO,\n        ExpressionParser.getInstance().nextItem(reader, context));\n    assertEquals(\"Must be LESS\", AbstractOperator.findForClass(OperatorLESS.class),\n        ExpressionParser.getInstance().nextItem(reader, context));\n    assertNull(\"Must be null\", ExpressionParser.getInstance().nextItem(reader, context));\n  }\n\n  @Test\n  public void testNextItem_oneValue() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final PushbackReader reader = new PushbackReader(new StringReader(\"3\"));\n    assertEquals(\"Must be 3\", Value.INT_THREE,\n        ExpressionParser.getInstance().nextItem(reader, context));\n    assertNull(\"Must be null\", ExpressionParser.getInstance().nextItem(reader, context));\n  }\n\n  @Test\n  public void testNextItem_oneHexValue() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final PushbackReader reader = new PushbackReader(new StringReader(\"0xfF\"));\n    assertEquals(\"Must be 255\", Value.valueOf(255L),\n        ExpressionParser.getInstance().nextItem(reader, context));\n    assertNull(\"Must be null\", ExpressionParser.getInstance().nextItem(reader, context));\n  }\n\n  @Test\n  public void testNextItem_oneBooleanTrueValue() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final PushbackReader reader = new PushbackReader(new StringReader(\"true\"));\n    assertEquals(\"Must be TRUE\", Value.BOOLEAN_TRUE,\n        ExpressionParser.getInstance().nextItem(reader, context));\n    assertNull(\"Must be null\", ExpressionParser.getInstance().nextItem(reader, context));\n  }\n\n  @Test\n  public void testNextItem_oneBooleanFalseValue() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final PushbackReader reader = new PushbackReader(new StringReader(\"false\"));\n    assertEquals(\"Must be FALSE\", Value.BOOLEAN_FALSE,\n        ExpressionParser.getInstance().nextItem(reader, context));\n    assertNull(\"Must be null\", ExpressionParser.getInstance().nextItem(reader, context));\n  }\n\n  @Test\n  public void testNextItem_oneOperator() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final PushbackReader reader = new PushbackReader(new StringReader(\"/\"));\n    assertEquals(\"Must be DIV\", AbstractOperator.findForClass(OperatorDIV.class),\n        ExpressionParser.getInstance().nextItem(reader, context));\n    assertNull(\"Must be null\", ExpressionParser.getInstance().nextItem(reader, context));\n  }\n\n  @Test\n  public void testNextItem_complexExpression() throws Exception {\n\n    final PreprocessorContext context = prepareMockContext();\n\n    final PushbackReader reader =\n        new PushbackReader(new StringReader(\"xml_attr(1.3%abs(1+2)*3/4,\\\"hello\\\"==\\\"\\nworld\\t\\\")\"));\n\n    final ExpressionItem[] items = new ExpressionItem[] {\n        AbstractFunction.findForClass(FunctionXML_ATTR.class),\n        ExpressionParser.SpecialItem.BRACKET_OPENING,\n        Value.valueOf(1.3f),\n        AbstractOperator.findForClass(OperatorMOD.class),\n        AbstractFunction.findForClass(FunctionABS.class),\n        ExpressionParser.SpecialItem.BRACKET_OPENING,\n        Value.INT_ONE,\n        AbstractOperator.findForClass(OperatorADD.class),\n        Value.INT_TWO,\n        ExpressionParser.SpecialItem.BRACKET_CLOSING,\n        AbstractOperator.findForClass(OperatorMUL.class),\n        Value.INT_THREE,\n        AbstractOperator.findForClass(OperatorDIV.class),\n        Value.INT_FOUR,\n        ExpressionParser.SpecialItem.COMMA,\n        Value.valueOf(\"hello\"),\n        AbstractOperator.findForClass(OperatorEQU.class),\n        Value.valueOf(\"\\nworld\\t\"),\n        ExpressionParser.SpecialItem.BRACKET_CLOSING\n    };\n\n    int index = 0;\n    for (final ExpressionItem item : items) {\n      assertEquals(\"Position \" + index + \" must be equal\", item,\n          ExpressionParser.getInstance().nextItem(reader, context));\n      index++;\n    }\n    assertNull(ExpressionParser.getInstance().nextItem(reader, context));\n  }\n\n  @Test\n  public void testParsing_oneValue() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final ExpressionParser parser = ExpressionParser.getInstance();\n    final ExpressionTree tree = parser.parse(\"3\", context);\n\n    final ExpressionTreeElement root = tree.getRoot();\n    assertEquals(\"Root is 3\", Value.INT_THREE, root.getItem());\n  }\n\n  @Test\n  public void testParsing_negativeNumber() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final ExpressionParser parser = ExpressionParser.getInstance();\n    final ExpressionTree tree = parser.parse(Long.toString(Long.MIN_VALUE + 1), context);\n\n    final ExpressionTreeElement root = tree.getRoot();\n    assertEquals(\"Root is Long.MIN_VALUE+1\", Value.valueOf(Long.MIN_VALUE + 1), root.getItem());\n  }\n\n  @Test\n  public void testParsing_easyExpression() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final ExpressionParser parser = ExpressionParser.getInstance();\n    final ExpressionTree tree = parser.parse(\"3*4/8\", context);\n\n    final ExpressionTreeElement root = tree.getRoot();\n    assertEquals(\"Root is DIV\", AbstractOperator.findForClass(OperatorDIV.class), root.getItem());\n    assertEquals(\"Right is 8\", Value.valueOf(8L), root.getChildForIndex(1).getItem());\n\n    final ExpressionTreeElement left = root.getChildForIndex(0);\n    assertEquals(\"Left is MUL\", AbstractOperator.findForClass(OperatorMUL.class), left.getItem());\n    assertEquals(\"Left-left is 3\", Value.INT_THREE, left.getChildForIndex(0).getItem());\n    assertEquals(\"Left-right is 4\", Value.INT_FOUR, left.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testParsing_complexExpression() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final ExpressionParser parser = ExpressionParser.getInstance();\n    final ExpressionTree tree =\n        parser.parse(\"(var1+1)*xml_attr(\\\"first\\\",\\\"hello\\\"+\\\"world\\\")\", context);\n\n    final ExpressionTreeElement root = tree.getRoot();\n\n    assertEquals(\"Root must be MUL\", AbstractOperator.findForClass(OperatorMUL.class),\n        root.getItem());\n\n    final ExpressionTreeElement left = root.getChildForIndex(0);\n    final ExpressionTreeElement right = root.getChildForIndex(1);\n\n    assertEquals(\"Left must be ADD\", AbstractOperator.findForClass(OperatorADD.class),\n        left.getItem());\n    assertEquals(\"Right must be Function\", AbstractFunction.findForClass(FunctionXML_ATTR.class),\n        right.getItem());\n  }\n\n  @Test\n  public void testParsing_deepIncludingBrackets() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final ExpressionParser parser = ExpressionParser.getInstance();\n    final ExpressionTree tree = parser.parse(\"((((((1+2))))))\", context);\n\n    final ExpressionTreeElement root = tree.getRoot();\n\n    assertEquals(\"Root must be ADD\", AbstractOperator.findForClass(OperatorADD.class),\n        root.getItem());\n    assertEquals(\"Left must be 1\", Value.INT_ONE, root.getChildForIndex(0).getItem());\n    assertEquals(\"Left must be 2\", Value.INT_TWO, root.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testParsing_insideFunctionCall() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final ExpressionParser parser = ExpressionParser.getInstance();\n    final ExpressionTree tree = parser.parse(\"xml_get(xml_get(1,2),3)\", context);\n\n    final AbstractFunction xmlElementAt = AbstractFunction.findForName(\"xml_get\");\n    assertNotNull(xmlElementAt);\n\n    final ExpressionTreeElement root = tree.getRoot();\n    assertEquals(\"Must be xml_get\", xmlElementAt, root.getItem());\n\n    final ExpressionTreeElement left = root.getChildForIndex(0);\n    final ExpressionTreeElement right = root.getChildForIndex(1);\n\n    assertEquals(\"Must be 3\", Value.INT_THREE, right.getItem());\n    assertEquals(\"Must be xml_get\", xmlElementAt, left.getItem());\n    assertEquals(\"Must be 1\", Value.INT_ONE, left.getChildForIndex(0).getItem());\n    assertEquals(\"Must be 2\", Value.INT_TWO, left.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testParsing_notEasyBrackets() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final ExpressionParser parser = ExpressionParser.getInstance();\n    final ExpressionTree tree = parser.parse(\"(1+2*(3-4))\", context);\n\n    final OperatorADD ADD = AbstractOperator.findForClass(OperatorADD.class);\n    final OperatorSUB SUB = AbstractOperator.findForClass(OperatorSUB.class);\n    final OperatorMUL MUL = AbstractOperator.findForClass(OperatorMUL.class);\n\n    final ExpressionTreeElement root = tree.getRoot();\n\n    assertEquals(\"Root must be ADD\", ADD, root.getItem());\n    assertEquals(\"Left must be 1\", Value.INT_ONE, root.getChildForIndex(0).getItem());\n\n    final ExpressionTreeElement right = root.getChildForIndex(1);\n    assertEquals(\"Right must be MUL\", MUL, right.getItem());\n    assertEquals(\"Right-left must be 2\", Value.INT_TWO, right.getChildForIndex(0).getItem());\n\n    final ExpressionTreeElement rightRight = right.getChildForIndex(1);\n    assertEquals(\"Right-right must be SUB\", SUB, rightRight.getItem());\n    assertEquals(\"Right-right-left must be 3\", Value.INT_THREE,\n        rightRight.getChildForIndex(0).getItem());\n    assertEquals(\"Right-right-right must be 4\", Value.INT_FOUR,\n        rightRight.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testParsing_emptyBrakes() throws Exception {\n    final PreprocessorContext context = prepareMockContext();\n\n    final ExpressionParser parser = ExpressionParser.getInstance();\n    final ExpressionTree tree = parser.parse(\"()\", context);\n    assertTrue(\"Must be empty\", tree.getRoot().isEmptySlot());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/ExpressionTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.AbstractSpyPreprocessorContextTest;\nimport org.junit.Test;\n\npublic class ExpressionTest extends AbstractSpyPreprocessorContextTest {\n\n  @Test\n  public void testSimpleExpression() throws Exception {\n    assertEquals(\"Must be equal\", Value.INT_TWO,\n        Expression.evalExpression(\"40/4-2*4\", preparePreprocessorContext(getCurrentTestFolder())));\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/ExpressionTreeTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\nimport com.igormaznitsa.jcp.expression.operators.AbstractOperator;\nimport com.igormaznitsa.jcp.expression.operators.OperatorADD;\nimport com.igormaznitsa.jcp.expression.operators.OperatorDIV;\nimport com.igormaznitsa.jcp.expression.operators.OperatorEQU;\nimport com.igormaznitsa.jcp.expression.operators.OperatorMUL;\nimport com.igormaznitsa.jcp.expression.operators.OperatorNOT;\nimport org.junit.Test;\n\npublic class ExpressionTreeTest {\n\n  @Test\n  public void testAddHierarchyTree() {\n    // 1+2\n\n    final ExpressionTree tree = new ExpressionTree();\n    tree.addItem(Value.INT_ONE);\n    tree.addItem(AbstractOperator.findForClass(OperatorADD.class));\n    tree.addItem(Value.INT_TWO);\n\n    final ExpressionTreeElement root = tree.getRoot();\n\n    assertNotNull(\"Root must not be null\", root);\n    assertEquals(\"Root must be add\", AbstractOperator.findForClass(OperatorADD.class),\n        root.getItem());\n    assertEquals(\"Left must be 1\", Value.INT_ONE, root.getChildForIndex(0).getItem());\n    assertEquals(\"Right must be 2\", Value.INT_TWO, root.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testAddDivHierarchyTree() {\n    // 1+2/3\n\n    final ExpressionTree tree = new ExpressionTree();\n    tree.addItem(Value.INT_ONE);\n    tree.addItem(AbstractOperator.findForClass(OperatorADD.class));\n    tree.addItem(Value.INT_TWO);\n    tree.addItem(AbstractOperator.findForClass(OperatorDIV.class));\n    tree.addItem(Value.INT_THREE);\n\n    final ExpressionTreeElement root = tree.getRoot();\n\n    assertNotNull(\"Root must not be null\", root);\n    assertEquals(\"Root must be add\", AbstractOperator.findForClass(OperatorADD.class),\n        root.getItem());\n    assertEquals(\"Left must be 1\", Value.INT_ONE, root.getChildForIndex(0).getItem());\n\n    final ExpressionTreeElement right = root.getChildForIndex(1);\n\n    assertEquals(\"Right must be div\", AbstractOperator.findForClass(OperatorDIV.class),\n        right.getItem());\n    assertEquals(\"Left for div must be 2\", Value.INT_TWO, right.getChildForIndex(0).getItem());\n    assertEquals(\"Right for div must be 3\", Value.INT_THREE, right.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testDivAddHierarchyTree() {\n    // 1/2+3\n\n    final ExpressionTree tree = new ExpressionTree();\n    tree.addItem(Value.INT_ONE);\n    tree.addItem(AbstractOperator.findForClass(OperatorDIV.class));\n    tree.addItem(Value.INT_TWO);\n    tree.addItem(AbstractOperator.findForClass(OperatorADD.class));\n    tree.addItem(Value.INT_THREE);\n\n    final ExpressionTreeElement root = tree.getRoot();\n\n    assertNotNull(\"Root must not be null\", root);\n    assertEquals(\"Root must be add\", AbstractOperator.findForClass(OperatorADD.class),\n        root.getItem());\n    assertEquals(\"Left must be div\", AbstractOperator.findForClass(OperatorDIV.class),\n        root.getChildForIndex(0).getItem());\n\n    final ExpressionTreeElement left = root.getChildForIndex(0);\n\n    assertEquals(\"Left for div must be 1\", Value.INT_ONE, left.getChildForIndex(0).getItem());\n    assertEquals(\"Right for div must be 2\", Value.INT_TWO, left.getChildForIndex(1).getItem());\n    assertEquals(\"Right for add must be 3\", Value.INT_THREE, root.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testAddAddAddHierarchyTree() {\n    // 1+2+3+4\n\n    final ExpressionTree TREE = new ExpressionTree();\n    final OperatorADD ADD = AbstractOperator.findForClass(OperatorADD.class);\n\n    TREE.addItem(Value.INT_ONE);\n    TREE.addItem(ADD);\n    TREE.addItem(Value.INT_TWO);\n    TREE.addItem(ADD);\n    TREE.addItem(Value.INT_THREE);\n    TREE.addItem(ADD);\n    TREE.addItem(Value.INT_FOUR);\n\n    final ExpressionTreeElement root = TREE.getRoot();\n\n    assertEquals(\"Root is ADD\", ADD, root.getItem());\n    assertEquals(\"Left for root is ADD\", ADD, root.getChildForIndex(0).getItem());\n    assertEquals(\"Right for root is 4\", Value.INT_FOUR, root.getChildForIndex(1).getItem());\n\n    ExpressionTreeElement left = root.getChildForIndex(0);\n    assertEquals(\"Left is ADD\", ADD, left.getChildForIndex(0).getItem());\n    assertEquals(\"Right is 3\", Value.INT_THREE, left.getChildForIndex(1).getItem());\n\n    left = left.getChildForIndex(0);\n    assertEquals(\"Left is 1\", Value.INT_ONE, left.getChildForIndex(0).getItem());\n    assertEquals(\"Right is 2\", Value.INT_TWO, left.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testMulAddMulHierarchyTree() {\n    // 1*2+3*4\n\n    final ExpressionTree TREE = new ExpressionTree();\n    final OperatorADD ADD = AbstractOperator.findForClass(OperatorADD.class);\n    final OperatorMUL MUL = AbstractOperator.findForClass(OperatorMUL.class);\n\n    TREE.addItem(Value.INT_ONE);\n    TREE.addItem(MUL);\n    TREE.addItem(Value.INT_TWO);\n    TREE.addItem(ADD);\n    TREE.addItem(Value.INT_THREE);\n    TREE.addItem(MUL);\n    TREE.addItem(Value.INT_FOUR);\n\n    final ExpressionTreeElement root = TREE.getRoot();\n\n    assertEquals(\"Root is ADD\", ADD, root.getItem());\n\n    final ExpressionTreeElement left = root.getChildForIndex(0);\n    final ExpressionTreeElement right = root.getChildForIndex(1);\n\n    assertEquals(\"Left is MUL\", MUL, left.getItem());\n    assertEquals(\"Right is MUL\", MUL, right.getItem());\n\n    assertEquals(\"Left-Left is 1\", Value.INT_ONE, left.getChildForIndex(0).getItem());\n    assertEquals(\"Left-Right is 2\", Value.INT_TWO, left.getChildForIndex(1).getItem());\n    assertEquals(\"Right-Left is 3\", Value.INT_THREE, right.getChildForIndex(0).getItem());\n    assertEquals(\"Right-Right is 4\", Value.INT_FOUR, right.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testAddInBrakesMulHierarchyTree() {\n    // (1+2)*3 \n\n    final ExpressionTree MAIN_TREE = new ExpressionTree();\n    final ExpressionTree BRAKE_TREE = new ExpressionTree();\n\n    final OperatorADD ADD = AbstractOperator.findForClass(OperatorADD.class);\n    final OperatorMUL MUL = AbstractOperator.findForClass(OperatorMUL.class);\n\n    BRAKE_TREE.addItem(Value.INT_ONE);\n    BRAKE_TREE.addItem(ADD);\n    BRAKE_TREE.addItem(Value.INT_TWO);\n\n    MAIN_TREE.addTree(BRAKE_TREE);\n    MAIN_TREE.addItem(MUL);\n    MAIN_TREE.addItem(Value.INT_THREE);\n\n    final ExpressionTreeElement root = MAIN_TREE.getRoot();\n\n    assertEquals(\"Root must be MUL\", MUL, root.getItem());\n    assertEquals(\"Right must be 3\", Value.INT_THREE, root.getChildForIndex(1).getItem());\n\n    final ExpressionTreeElement left = root.getChildForIndex(0);\n    assertEquals(\"Must be ADD\", ADD, left.getItem());\n    assertEquals(\"Must be 1\", Value.INT_ONE, left.getChildForIndex(0).getItem());\n    assertEquals(\"Must be 2\", Value.INT_TWO, left.getChildForIndex(1).getItem());\n  }\n\n  @Test\n  public void testMulAddInBrakesMulHierarchyTree() {\n    // 1*(2+3)*4\n\n    final ExpressionTree MAIN_TREE = new ExpressionTree();\n    final ExpressionTree BRAKE_TREE = new ExpressionTree();\n\n    final OperatorADD ADD = AbstractOperator.findForClass(OperatorADD.class);\n    final OperatorMUL MUL = AbstractOperator.findForClass(OperatorMUL.class);\n\n    BRAKE_TREE.addItem(Value.INT_TWO);\n    BRAKE_TREE.addItem(ADD);\n    BRAKE_TREE.addItem(Value.INT_THREE);\n\n    MAIN_TREE.addItem(Value.INT_ONE);\n    MAIN_TREE.addItem(MUL);\n    MAIN_TREE.addTree(BRAKE_TREE);\n    MAIN_TREE.addItem(MUL);\n    MAIN_TREE.addItem(Value.INT_FOUR);\n\n    final ExpressionTreeElement root = MAIN_TREE.getRoot();\n\n    assertEquals(\"Root must be MUL\", MUL, root.getItem());\n    assertEquals(\"Right must be 4\", Value.INT_FOUR, root.getChildForIndex(1).getItem());\n\n    final ExpressionTreeElement right = root.getChildForIndex(0);\n    assertEquals(\"Right must be MUL\", MUL, right.getItem());\n    assertEquals(\"Right-right must be 1\", Value.INT_ONE, right.getChildForIndex(0).getItem());\n\n    final ExpressionTreeElement rightLeft = right.getChildForIndex(1);\n    assertEquals(\"Right-left must be ADD\", ADD, rightLeft.getItem());\n    assertEquals(\"Right-left-right must be 2\", Value.INT_TWO,\n        rightLeft.getChildForIndex(0).getItem());\n    assertEquals(\"Right-left-right must be 3\", Value.INT_THREE,\n        rightLeft.getChildForIndex(1).getItem());\n\n  }\n\n  @Test\n  public void testNotEquHierarchy() {\n    // !true==false\n\n    final OperatorNOT NOT = AbstractOperator.findForClass(OperatorNOT.class);\n    final OperatorEQU EQU = AbstractOperator.findForClass(OperatorEQU.class);\n\n    final ExpressionTree MAIN_TREE = new ExpressionTree();\n\n    MAIN_TREE.addItem(NOT);\n    MAIN_TREE.addItem(Value.BOOLEAN_TRUE);\n    MAIN_TREE.addItem(EQU);\n    MAIN_TREE.addItem(Value.BOOLEAN_FALSE);\n\n    final ExpressionTreeElement root = MAIN_TREE.getRoot();\n\n    assertEquals(\"Root must be EQU\", EQU, root.getItem());\n    assertEquals(\"Root right must be FALSE\", Value.BOOLEAN_FALSE,\n        root.getChildForIndex(1).getItem());\n\n    final ExpressionTreeElement rootLeft = root.getChildForIndex(0);\n\n    assertEquals(\"Left must be NOT\", NOT, rootLeft.getItem());\n    assertEquals(\"Left-left must be TRUE\", Value.BOOLEAN_TRUE,\n        rootLeft.getChildForIndex(0).getItem());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/AbstractFunctionTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static java.util.Collections.singletonList;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.AbstractSpyPreprocessorContextTest;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.junit.Test;\n\npublic abstract class AbstractFunctionTest extends AbstractSpyPreprocessorContextTest {\n\n  protected static Map<String, Value> var(final Map<String, Value> map, final String name,\n                                          final Value val) {\n    map.put(name, val);\n    return map;\n  }\n\n  protected static Map<String, Value> var(final String name, final Value val) {\n    final Map<String, Value> result = new HashMap<>();\n    result.put(name, val);\n    return result;\n  }\n\n  @Test\n  public abstract void testName();\n\n  @Test\n  public abstract void testReference();\n\n  @Test\n  public abstract void testArity();\n\n  @Test\n  public abstract void testAllowedArgumentTypes();\n\n  @Test\n  public abstract void testResultType();\n\n  protected void assertReference(final AbstractFunction function) {\n    final String reference = function.getReference();\n    assertNotNull(\"Reference must not be null\", reference);\n    assertFalse(\"Reference must not be empty\", reference.isEmpty());\n    assertTrue(\"Reference must not be too short\", reference.length() > 10);\n  }\n\n  protected void assertAllowedArguments(final AbstractFunction function,\n                                        final List<List<ValueType>> checkingData) {\n    final List<List<ValueType>> argTypes = function.getAllowedArgumentTypes();\n    for (final List<ValueType> currentTypes : argTypes) {\n      boolean found = false;\n      for (final List<ValueType> etalon : checkingData) {\n        if (currentTypes.equals(etalon)) {\n          found = true;\n          break;\n        }\n      }\n      if (!found) {\n        fail(\"Found not allowed argument types \" + currentTypes);\n      }\n    }\n  }\n\n  protected void assertFunction(final String expression, final Value expected) throws Exception {\n    this.assertFunction(expression, expected, null, null);\n  }\n\n  protected void assertFunction(final String expression, final Value expected,\n                                final Map<String, Value> localVars,\n                                final Map<String, Value> globalVars) throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(singletonList(\"./\"));\n\n    if (localVars != null) {\n      for (final Map.Entry<String, Value> e : localVars.entrySet()) {\n        context.setLocalVariable(e.getKey(), e.getValue());\n      }\n    }\n\n    if (globalVars != null) {\n      for (final Map.Entry<String, Value> e : globalVars.entrySet()) {\n        context.setLocalVariable(e.getKey(), e.getValue());\n      }\n    }\n\n    final Value result = Expression.evalExpression(expression, context);\n    assertEquals(\"Must be equal\", expected, result);\n  }\n\n  protected Throwable getRootCause(final Throwable thr) {\n    if (thr == null) {\n      return null;\n    }\n    Throwable t = thr;\n    while (t != null) {\n      if (t.getCause() == null) {\n        return t;\n      }\n      t = t.getCause();\n    }\n    return t;\n  }\n\n  protected void assertFunctionException(final String expression) throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(this.getCurrentTestFolder());\n    try {\n      Expression.evalExpression(expression, context);\n      fail(\"Must throw RuntimeException [\" + expression + ']');\n    } catch (RuntimeException ex) {\n      final PreprocessorException cause = PreprocessorException.extractPreprocessorException(ex);\n      if (cause != null) {\n        return;\n      }\n      ex.printStackTrace();\n      fail(\"Expression must contain preprocessor exception as cause [\" + expression +\n          \"] but it doesn't have [\" + ex.getClass().getName() + ']');\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionABSTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionABSTest extends AbstractFunctionTest {\n\n  private static final FunctionABS HANDLER = new FunctionABS();\n\n  @Test\n  public void testExecution_Int() throws Exception {\n    assertFunction(\"abs(-10)\", Value.valueOf(Long.valueOf(10)));\n    assertFunction(\"abs(1-3*2)\", Value.valueOf(Long.valueOf(5)));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_Float() throws Exception {\n    assertFunction(\"abs(-10.5)\", Value.valueOf(10.5f));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"abs(\\\"test\\\")\");\n    assertFunctionException(\"abs()\");\n    assertFunctionException(\"abs(false)\");\n    assertFunctionException(\"abs(1,2,3)\");\n    assertDestinationFolderEmpty();\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"abs\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.INT), List.of(ValueType.FLOAT)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.ANY, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionBINFILETest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionBINFILETest extends AbstractFunctionTest {\n\n  private static final FunctionBINFILE HANDLER = new FunctionBINFILE();\n\n  @Test\n  public void testExecution_Base64Encoding() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBin.txt\\\",\\\"base64\\\")\", context);\n    assertEquals(\"SGVsbG8gUHJlcHJvY2Vzc29yIQ==\", result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_Base64Encoding_Deflate() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBin.txt\\\",\\\"base64d\\\")\", context);\n    assertEquals(\"eNrzSM3JyVcIKEotKMpPTi0uzi9SBABHuwc9\", result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_Base64EncodingSplitted() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBin.txt\\\",\\\"base64s\\\")\", context);\n    assertEquals(\"SGVsbG8gUHJlcHJvY2Vzc29yIQ==\", result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_ByteArrayEncoding() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBin.txt\\\",\\\"byte[]\\\")\", context);\n    assertEquals(\n        \"(byte)0x48,(byte)0x65,(byte)0x6C,(byte)0x6C,(byte)0x6F,(byte)0x20,(byte)0x50,(byte)0x72,(byte)0x65,(byte)0x70,(byte)0x72,(byte)0x6F,(byte)0x63,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x6F,(byte)0x72,(byte)0x21\",\n        result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_ByteArrayEncodingSplitted() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBin.txt\\\",\\\"byte[]s\\\")\", context);\n    final String eof = System.getProperty(\"line.separator\");\n    assertEquals(\n        \"(byte)0x48,(byte)0x65,(byte)0x6C,(byte)0x6C,(byte)0x6F,(byte)0x20,(byte)0x50,(byte)0x72,\" +\n            eof +\n            \"(byte)0x65,(byte)0x70,(byte)0x72,(byte)0x6F,(byte)0x63,(byte)0x65,(byte)0x73,(byte)0x73,\" +\n            eof +\n            \"(byte)0x6F,(byte)0x72,(byte)0x21\", result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_UINT8ArrayEncoding() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBinLong.txt\\\",\\\"uint8[]\\\")\", context);\n    assertEquals(\n        \"208,186,208,176,208,186,208,184,208,181,32,209,130,208,190,32,209,128,209,131,209,129,209,129,208,186,208,184,208,181,32,208,177,209,131,208,186,208,178,209,139,10,72,101,108,108,111,32,80,114,101,112,114,111,99,101,115,115,111,114,33,32,105,116,32,105,115,32,118,101,114,121,32,118,101,114,121,32,118,101,114,121,32,108,111,110,103,32,108,105,110,101,32,116,111,32,102,105,108,108,32,116,104,101,32,102,105,108,101,33,32,115,111,109,101,116,105,109,101,32,105,116,32,105,115,32,117,115,101,102,117,108,32,102,111,114,32,116,101,115,116,115,33,10,97,108,115,32,73,32,100,101,99,105,100,101,100,32,116,111,32,97,100,100,32,111,110,101,32,109,111,114,101,32,108,105,110,101,46\",\n        result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_INT8ArrayEncoding() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBinLong.txt\\\",\\\"int8[]\\\")\", context);\n    assertEquals(\n        \"-48,-70,-48,-80,-48,-70,-48,-72,-48,-75,32,-47,-126,-48,-66,32,-47,-128,-47,-125,-47,-127,-47,-127,-48,-70,-48,-72,-48,-75,32,-48,-79,-47,-125,-48,-70,-48,-78,-47,-117,10,72,101,108,108,111,32,80,114,101,112,114,111,99,101,115,115,111,114,33,32,105,116,32,105,115,32,118,101,114,121,32,118,101,114,121,32,118,101,114,121,32,108,111,110,103,32,108,105,110,101,32,116,111,32,102,105,108,108,32,116,104,101,32,102,105,108,101,33,32,115,111,109,101,116,105,109,101,32,105,116,32,105,115,32,117,115,101,102,117,108,32,102,111,114,32,116,101,115,116,115,33,10,97,108,115,32,73,32,100,101,99,105,100,101,100,32,116,111,32,97,100,100,32,111,110,101,32,109,111,114,101,32,108,105,110,101,46\",\n        result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_DEFLATEINT8ArrayEncoding() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBinLong.txt\\\",\\\"int8[]d\\\")\", context);\n    assertEquals(\n        \"120,-38,77,-116,49,10,-62,64,16,69,-5,-100,-30,-25,2,-98,67,59,-81,16,-78,19,93,-104,100,100,103,35,-40,25,45,-67,-116,10,-126,-92,-16,12,51,55,50,-111,20,54,-97,-57,-121,-9,108,-76,-69,-115,-10,-74,23,-4,98,31,-8,-39,-81,62,-8,-80,124,-10,-16,-21,-124,79,-65,21,107,98,22,108,19,29,-110,-44,-92,42,-87,68,-52,-120,-118,35,-91,-45,-33,-80,116,59,112,-20,8,89,-48,68,102,-28,61,-51,64,37,84,90,-54,-79,-91,-59,-20,-107,-102,-98,-47,72,66,38,-51,90,22,21,43,54,8,84,-57,64,97,14,84,33,64,-90,86,43,-119,126,-43,-43,23,-66,-35,76,-84\",\n        result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_UINT8ArrayEncodingSplitted() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBinLong.txt\\\",\\\"uint8[]s\\\")\", context);\n    final String eof = System.getProperty(\"line.separator\");\n    assertEquals(\n        \"208,186,208,176,208,186,208,184,208,181,32,209,130,208,190,32,209,128,209,131,209,\" + eof\n            + \"129,209,129,208,186,208,184,208,181,32,208,177,209,131,208,186,208,178,209,139,10,\" +\n            eof\n            + \"72,101,108,108,111,32,80,114,101,112,114,111,99,101,115,115,111,114,33,32,105,116,\" +\n            eof\n            +\n            \"32,105,115,32,118,101,114,121,32,118,101,114,121,32,118,101,114,121,32,108,111,110,\" +\n            eof\n            +\n            \"103,32,108,105,110,101,32,116,111,32,102,105,108,108,32,116,104,101,32,102,105,108,\" +\n            eof\n            +\n            \"101,33,32,115,111,109,101,116,105,109,101,32,105,116,32,105,115,32,117,115,101,102,\" +\n            eof\n            +\n            \"117,108,32,102,111,114,32,116,101,115,116,115,33,10,97,108,115,32,73,32,100,101,99,\" +\n            eof\n            + \"105,100,101,100,32,116,111,32,97,100,100,32,111,110,101,32,109,111,114,101,32,108,\" +\n            eof\n            + \"105,110,101,46\", result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_INT8ArrayEncodingSplitted() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBinLong.txt\\\",\\\"int8[]s\\\")\", context);\n    final String eof = System.getProperty(\"line.separator\");\n    assertEquals(\n        \"-48,-70,-48,-80,-48,-70,-48,-72,-48,-75,32,-47,-126,-48,-66,32,-47,-128,-47,-125,\" + eof\n            + \"-47,-127,-47,-127,-48,-70,-48,-72,-48,-75,32,-48,-79,-47,-125,-48,-70,-48,-78,-47,\" +\n            eof\n            + \"-117,10,72,101,108,108,111,32,80,114,101,112,114,111,99,101,115,115,111,114,33,32,\" +\n            eof\n            +\n            \"105,116,32,105,115,32,118,101,114,121,32,118,101,114,121,32,118,101,114,121,32,108,\" +\n            eof\n            +\n            \"111,110,103,32,108,105,110,101,32,116,111,32,102,105,108,108,32,116,104,101,32,102,\" +\n            eof\n            +\n            \"105,108,101,33,32,115,111,109,101,116,105,109,101,32,105,116,32,105,115,32,117,115,\" +\n            eof\n            +\n            \"101,102,117,108,32,102,111,114,32,116,101,115,116,115,33,10,97,108,115,32,73,32,100,\" +\n            eof\n            + \"101,99,105,100,101,100,32,116,111,32,97,100,100,32,111,110,101,32,109,111,114,101,\" +\n            eof\n            + \"32,108,105,110,101,46\", result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_DEFLATEINT8ArrayEncodingSplitted() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result =\n        Expression.evalExpression(\"binfile(\\\"./eval/TestBinLong.txt\\\",\\\"int8[]ds\\\")\", context);\n    final String eof = System.getProperty(\"line.separator\");\n    assertEquals(\n        \"120,-38,77,-116,49,10,-62,64,16,69,-5,-100,-30,-25,2,-98,67,59,-81,16,-78,19,93,-104,\" +\n            eof\n            + \"100,100,103,35,-40,25,45,-67,-116,10,-126,-92,-16,12,51,55,50,-111,20,54,-97,-57,\" +\n            eof\n            + \"-121,-9,108,-76,-69,-115,-10,-74,23,-4,98,31,-8,-39,-81,62,-8,-80,124,-10,-16,-21,\" +\n            eof\n            +\n            \"-124,79,-65,21,107,98,22,108,19,29,-110,-44,-92,42,-87,68,-52,-120,-118,35,-91,-45,\" +\n            eof\n            + \"-33,-80,116,59,112,-20,8,89,-48,68,102,-28,61,-51,64,37,84,90,-54,-79,-91,-59,-20,\" +\n            eof\n            +\n            \"-107,-102,-98,-47,72,66,38,-51,90,22,21,43,54,8,84,-57,64,97,14,84,33,64,-90,86,43,\" +\n            eof\n            + \"-119,126,-43,-43,23,-66,-35,76,-84\", result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_Str_wrongCases() throws Exception {\n    assertFunctionException(\"binfile()\");\n    assertFunctionException(\"binfile(true)\");\n    assertFunctionException(\"binfile(,)\");\n    assertFunctionException(\"binfile(1,\\\"ttt\\\")\");\n    assertFunctionException(\"binfile(\\\"d\\\",\\\"ttt\\\",1)\");\n    assertFunctionException(\"binfile(123)\");\n    assertDestinationFolderEmpty();\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"binfile\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(2), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING, ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionDefinedByUserTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static com.igormaznitsa.jcp.expression.ExpressionTreeElement.ANY_ARITY;\nimport static org.junit.Assert.assertEquals;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyList;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.powermock.api.mockito.PowerMockito.mock;\nimport static org.powermock.api.mockito.PowerMockito.when;\n\nimport com.igormaznitsa.jcp.AbstractSpyPreprocessorContextTest;\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.context.PreprocessingState;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport java.io.File;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionDefinedByUserTest extends AbstractSpyPreprocessorContextTest {\n\n  @Test\n  public void testExecution_withArguments() throws Exception {\n    final PreprocessorExtension mock = mock(PreprocessorExtension.class);\n    when(mock.hasUserFunction(anyString(), any())).thenReturn(true);\n    when(mock.isAllowed(any())).thenReturn(true);\n\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n\n    final Value testResult = Value.valueOf(\"result\");\n    context.addPreprocessorExtension(mock);\n\n    when(mock.processUserFunction(any(), eq(\"test\"), anyList())).thenReturn(testResult);\n    when(mock.getUserFunctionArity(eq(\"test\"))).thenReturn(Set.of(5));\n\n    assertEquals(testResult, Expression.evalExpression(\"$test(1,2,3,4,5+6)\", context));\n\n    verify(mock).processUserFunction(any(), eq(\"test\"), eq(List.of(\n        Value.valueOf(1L),\n        Value.valueOf(2L),\n        Value.valueOf(3L),\n        Value.valueOf(4L),\n        Value.valueOf(11L))));\n  }\n\n  @Test\n  public void testExecution_withAnyArguments() throws Exception {\n    final PreprocessorExtension mock = mock(PreprocessorExtension.class);\n    when(mock.hasUserFunction(anyString(), any())).thenReturn(true);\n    when(mock.isAllowed(any())).thenReturn(true);\n\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n\n    final Value testResult = Value.valueOf(\"result\");\n    context.addPreprocessorExtension(mock);\n\n    when(mock.processUserFunction(any(), eq(\"test\"), anyList())).thenReturn(testResult);\n    when(mock.getUserFunctionArity(eq(\"test\"))).thenReturn(Set.of(ANY_ARITY));\n\n    assertEquals(testResult, Expression.evalExpression(\"$test(1,2,3,4,5+6)\", context));\n\n    verify(mock).processUserFunction(any(), eq(\"test\"), eq(List.of(\n        Value.valueOf(1L),\n        Value.valueOf(2L),\n        Value.valueOf(3L),\n        Value.valueOf(4L),\n        Value.valueOf(11L))));\n  }\n\n  @Test\n  public void testExecution_withoutArguments() throws Exception {\n    final PreprocessorExtension mock = mock(PreprocessorExtension.class);\n    when(mock.hasUserFunction(anyString(), any())).thenReturn(true);\n    when(mock.isAllowed(any())).thenReturn(true);\n\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.addAllPreprocessedResources(List.of(\n        new FileInfoContainer(new File(PreprocessingState.FAKE_FILE_PATH),\n            PreprocessingState.FAKE_FILE_PATH, false)));\n\n    final Value testResult = Value.valueOf(\"result\");\n    context.addPreprocessorExtension(mock);\n\n    when(mock.processUserFunction(any(), eq(\"test\"), anyList())).thenReturn(testResult);\n    when(mock.getUserFunctionArity(eq(\"test\"))).thenReturn(Set.of(0));\n\n    assertEquals(testResult, Expression.evalExpression(\"$test()\", context));\n\n    verify(mock).processUserFunction(any(), eq(\"test\"), eq(List.of()));\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionESCTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionESCTest extends AbstractFunctionTest {\n\n  private static final FunctionESC HANDLER = new FunctionESC();\n\n  @Test\n  public void testExecution() throws Exception {\n    assertFunction(\"esc(\\\"\\\")\", Value.valueOf(\"\"));\n    assertFunction(\"esc(\\\"hello\\nworld\\\")\", Value.valueOf(\"hello\\\\nworld\"));\n    assertFunction(\"esc(\\\"\\u0011abc\\r\\t\\f\\b\\n\\\")\", Value.valueOf(\"\\\\u0011abc\\\\r\\\\t\\\\f\\\\b\\\\n\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"esc()\");\n    assertFunctionException(\"esc(1)\");\n    assertFunctionException(\"esc(1,2)\");\n    assertFunctionException(\"esc(true)\");\n    assertDestinationFolderEmpty();\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"esc\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionEVALFILETest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.io.File;\nimport java.util.List;\nimport java.util.Set;\nimport org.apache.commons.text.StringEscapeUtils;\nimport org.junit.Test;\n\npublic class FunctionEVALFILETest extends AbstractFunctionTest {\n\n  private static final FunctionEVALFILE HANDLER = new FunctionEVALFILE();\n\n  private static final String TEST_EVAL_PATH =\n      \"/eval/TestEval.java\".replace('/', File.separatorChar);\n  private static final String TEST_EVAL_WITH_INCLUDED_PATH =\n      \"/eval/TestEvalWithIncluded.java\".replace('/', File.separatorChar);\n\n  @Test\n  public void testExecution_ErrorForUndefinedVariable() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    try {\n      Expression.evalExpression(\n          String.format(\"evalfile(\\\".%s\\\")\", StringEscapeUtils.escapeJava(TEST_EVAL_PATH)),\n          context);\n    } catch (Exception ex) {\n      assertTrue(getRootCause(ex).getMessage().contains(\"hello_world\"));\n    }\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_VisibilityLocalVariable() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result = Expression.evalExpression(\"evalfile(\\\"./eval/TestEval.java\\\")\", context);\n    assertEquals(\"System.out.println(\\\"Hello World!\\\");\", result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_AbsolutePath() throws Exception {\n    final List<String> theTestFolder = getCurrentTestFolder();\n    final PreprocessorContext context = preparePreprocessorContext(theTestFolder);\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result = Expression.evalExpression(String.format(\"evalfile(\\\"%s\\\")\",\n        StringEscapeUtils.escapeJava(theTestFolder.get(0) + TEST_EVAL_PATH)), context);\n    assertEquals(\"System.out.println(\\\"Hello World!\\\");\", result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_IncludedEvalCall() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setLocalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result = Expression.evalExpression(String\n            .format(\"evalfile(\\\".%s\\\")\", StringEscapeUtils.escapeJava(TEST_EVAL_WITH_INCLUDED_PATH)),\n        context);\n    final String resultstr = result.asString().trim();\n    assertTrue(resultstr.startsWith(\"System.out.println(\\\"Hello World!\\\");\"));\n    assertTrue(resultstr.endsWith(\"TestEvalWithIncluded.java\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_VisibilityGlobalVariable() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setGlobalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result = Expression.evalExpression(\n        String.format(\"evalfile(\\\".%s\\\")\", StringEscapeUtils.escapeJava(TEST_EVAL_PATH)), context);\n    assertEquals(\"System.out.println(\\\"Hello World!\\\");\", result.asString().trim());\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_ConditionsInsideFile() throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    context.setGlobalVariable(\"includemeth\", Value.valueOf(true));\n    context.setGlobalVariable(\"hello_world\", Value.valueOf(\"Hello World!\"));\n    final Value result = Expression.evalExpression(\n        String.format(\"evalfile(\\\".%s\\\")\", StringEscapeUtils.escapeJava(TEST_EVAL_PATH)), context);\n    assertTrue(result.asString().contains(\"public void main(String ... args){\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_Str_wrongCases() throws Exception {\n    assertFunctionException(\"evalfile()\");\n    assertFunctionException(\"evalfile(true)\");\n    assertFunctionException(\"evalfile(,)\");\n    assertFunctionException(\"evalfile(1,\\\"ttt\\\")\");\n    assertFunctionException(\"evalfile(\\\"d\\\",\\\"ttt\\\")\");\n    assertFunctionException(\"evalfile(123)\");\n    assertDestinationFolderEmpty();\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"evalfile\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionISSUBSTRTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionISSUBSTRTest extends AbstractFunctionTest {\n\n  private static final FunctionISSUBSTR HANDLER = new FunctionISSUBSTR();\n\n  @Test\n  public void testExecution_StrStr() throws Exception {\n    assertFunction(\"issubstr(\\\"test\\\",\\\"onetesttwo\\\")\", Value.BOOLEAN_TRUE);\n    assertFunction(\"issubstr(\\\"Test\\\",\\\"onetesttwo\\\")\", Value.BOOLEAN_TRUE);\n    assertFunction(\"issubstr(\\\"test\\\",\\\"oneTesttwo\\\")\", Value.BOOLEAN_TRUE);\n    assertFunction(\"issubstr(\\\"test\\\",\\\"one\\\")\", Value.BOOLEAN_FALSE);\n    assertFunction(\"issubstr(\\\"\\\",\\\"one\\\")\", Value.BOOLEAN_TRUE);\n    assertFunction(\"issubstr(\\\"\\\",\\\"\\\")\", Value.BOOLEAN_TRUE);\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_StrStr_wrongCases() throws Exception {\n    assertFunctionException(\"issubstr()\");\n    assertFunctionException(\"issubstr(\\\"test\\\")\");\n    assertFunctionException(\"issubstr(,)\");\n    assertFunctionException(\"issubstr(1,\\\"ttt\\\")\");\n    assertFunctionException(\"issubstr(false,\\\"ttt\\\")\");\n    assertFunctionException(\"issubstr(false,true)\");\n    assertFunctionException(\"issubstr(\\\"d\\\",1)\");\n    assertDestinationFolderEmpty();\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"issubstr\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(2), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING, ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.BOOLEAN, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionISTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionISTest extends AbstractFunctionTest {\n\n  private static final FunctionIS HANDLER = new FunctionIS();\n\n  @Test\n  public void testExecution_StrAny_VarPresented() throws Exception {\n    assertFunction(\"is(\\\"hello_var\\\",true)\", Value.BOOLEAN_TRUE,\n        var(\"hello_var\", Value.BOOLEAN_TRUE), null);\n    assertFunction(\"is(\\\"HELLO_VAR\\\",true)\", Value.BOOLEAN_TRUE,\n        var(\"hello_var\", Value.BOOLEAN_TRUE), null);\n    assertFunction(\"is(\\\"hello_var\\\",false)\", Value.BOOLEAN_FALSE,\n        var(\"hello_var\", Value.BOOLEAN_TRUE), null);\n    assertFunction(\"is(\\\"hello_var\\\",true)\", Value.BOOLEAN_TRUE, null,\n        var(\"hello_var\", Value.BOOLEAN_TRUE));\n    assertFunction(\"is(\\\"hello_var\\\",false)\", Value.BOOLEAN_FALSE, null,\n        var(\"hello_var\", Value.BOOLEAN_TRUE));\n    assertFunction(\"is(\\\"hello_var\\\",\\\"true\\\")\", Value.BOOLEAN_TRUE, null,\n        var(\"hello_var\", Value.BOOLEAN_TRUE));\n    assertFunction(\"is(\\\"hello_var\\\",\\\"false\\\")\", Value.BOOLEAN_FALSE, null,\n        var(\"hello_var\", Value.BOOLEAN_TRUE));\n    assertFunction(\"is(\\\"hello_var\\\",\\\"1\\\")\", Value.BOOLEAN_TRUE, null,\n        var(\"hello_var\", Value.INT_ONE));\n    assertFunction(\"is(\\\"hello_var\\\",\\\"2\\\")\", Value.BOOLEAN_FALSE, null,\n        var(\"hello_var\", Value.INT_ONE));\n    assertFunction(\"is(\\\"hello_var\\\",1)\", Value.BOOLEAN_TRUE, null,\n        var(\"hello_var\", Value.valueOf(\"1\")));\n    assertFunction(\"is(\\\"hello_var\\\",2)\", Value.BOOLEAN_FALSE, null,\n        var(\"hello_var\", Value.valueOf(\"1\")));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_StrAny_VarNotPresented() throws Exception {\n    assertFunction(\"is(\\\"hello_var\\\",true)\", Value.BOOLEAN_FALSE);\n    assertFunction(\"is(\\\"hello_var\\\",false)\", Value.BOOLEAN_FALSE);\n    assertFunction(\"is(\\\"hello_var\\\",true)\", Value.BOOLEAN_FALSE);\n    assertFunction(\"is(\\\"hello_var\\\",false)\", Value.BOOLEAN_FALSE);\n    assertFunction(\"is(\\\"hello_var\\\",\\\"true\\\")\", Value.BOOLEAN_FALSE);\n    assertFunction(\"is(\\\"hello_var\\\",\\\"false\\\")\", Value.BOOLEAN_FALSE);\n    assertFunction(\"is(\\\"hello_var\\\",\\\"1\\\")\", Value.BOOLEAN_FALSE);\n    assertFunction(\"is(\\\"hello_var\\\",\\\"2\\\")\", Value.BOOLEAN_FALSE);\n    assertFunction(\"is(\\\"hello_var\\\",1)\", Value.BOOLEAN_FALSE);\n    assertFunction(\"is(\\\"hello_var\\\",2)\", Value.BOOLEAN_FALSE);\n    assertDestinationFolderEmpty();\n  }\n//\n//  @Test\n//  public void testExecution_StrStr_wrongCases() throws Exception {\n//    assertFunctionException(\"issubstr()\");\n//    assertFunctionException(\"issubstr(\\\"test\\\")\");\n//    assertFunctionException(\"issubstr(,)\");\n//    assertFunctionException(\"issubstr(1,\\\"ttt\\\")\");\n//    assertFunctionException(\"issubstr(false,\\\"ttt\\\")\");\n//    assertFunctionException(\"issubstr(false,true)\");\n//    assertFunctionException(\"issubstr(\\\"d\\\",1)\");\n//    assertDestinationFolderEmpty();\n//  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"is\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(2), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING, ValueType.ANY)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.BOOLEAN, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionROUNDTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionROUNDTest extends AbstractFunctionTest {\n\n  private static final FunctionROUND HANDLER = new FunctionROUND();\n\n  @Test\n  public void testExecution_Float() throws Exception {\n    assertFunction(\"round(4.7)\", Value.valueOf(5L));\n    assertFunction(\"round(3.1+3.6)\", Value.valueOf(7L));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_Int() throws Exception {\n    assertFunction(\"round(4)\", Value.valueOf(4L));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"round(true)\");\n    assertFunctionException(\"round(\\\"aaa\\\")\");\n    assertFunctionException(\"round()\");\n    assertFunctionException(\"round(0.3,2.1)\");\n    assertDestinationFolderEmpty();\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"round\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.INT), List.of(ValueType.FLOAT)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.INT, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2CSVTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionSTR2CSVTest extends AbstractFunctionTest {\n\n  private static final FunctionSTR2CSV HANDLER = new FunctionSTR2CSV();\n\n  @Test\n  public void testExecution_Str() throws Exception {\n    assertFunction(\"str2csv(\\\"1,2\\\")\", Value.valueOf(\"\\\"1,2\\\"\"));\n    assertFunction(\"str2csv(\\\"33\\\")\", Value.valueOf(\"33\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"str2csv()\");\n    assertFunctionException(\"str2csv(1,2)\");\n    assertFunctionException(\"str2csv(true)\");\n    assertFunctionException(\"str2csv(3)\");\n    assertDestinationFolderEmpty();\n\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"str2csv\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2GOTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class FunctionSTR2GOTest extends AbstractFunctionTest {\n\n  private static final FunctionSTR2GO HANDLER = new FunctionSTR2GO();\n\n  @Test\n  public void testExecution_NoSplit() throws Exception {\n    assertFunction(\"str2go(\\\"\\\",false)\", Value.valueOf(\"\"));\n    assertFunction(\"str2go(\\\"hello\\nworld\\\",false)\", Value.valueOf(\"hello\\\\nworld\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_Split() throws Exception {\n    assertFunction(\"str2go(\\\"\\\",true)\", Value.valueOf(\"\\\"\\\"\"));\n    assertFunction(\"str2go(\\\"hello\\nworld\\\",true)\",\n        Value.valueOf(\"\\\"hello\\\\n\\\"\" + PreprocessorUtils.getNextLineCodes() + \"+\\\"world\\\"\"));\n    assertFunction(\"str2go(\\\"hello\\nworld\\n\\\",true)\",\n        Value.valueOf(\"\\\"hello\\\\n\\\"\" + PreprocessorUtils.getNextLineCodes() + \"+\\\"world\\\\n\\\"\"));\n    assertFunction(\"str2go(\\\"\\u000bhello\\u0007\\nworld\\n\\\",true)\", Value.valueOf(\n        \"\\\"\\\\vhello\\\\a\\\\n\\\"\" + PreprocessorUtils.getNextLineCodes() + \"+\\\"world\\\\n\\\"\"));\n    assertFunction(\"str2go(\\\"Здравствуй\\nМир\\n\\\",true)\", Value.valueOf(\n        \"\\\"\\\\u0417\\\\u0434\\\\u0440\\\\u0430\\\\u0432\\\\u0441\\\\u0442\\\\u0432\\\\u0443\\\\u0439\\\\n\\\"\" +\n            PreprocessorUtils.getNextLineCodes() + \"+\\\"\\\\u041c\\\\u0438\\\\u0440\\\\n\\\"\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"str2go()\");\n    assertFunctionException(\"str2go(1,2)\");\n    assertFunctionException(\"str2go(true)\");\n    assertFunctionException(\"str2go(true,\\\"ss\\\")\");\n    assertFunctionException(\"str2go(\\\"ss\\\",3)\");\n    assertDestinationFolderEmpty();\n\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"str2go\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(AbstractFunction.ARITY_2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING, ValueType.BOOLEAN)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2INTTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionSTR2INTTest extends AbstractFunctionTest {\n\n  private static final FunctionSTR2INT HANDLER = new FunctionSTR2INT();\n\n  @Test\n  public void testExecute_Str() throws Exception {\n    assertFunction(\"str2int(\\\"100\\\")\", Value.valueOf(100L));\n    assertFunction(\"str2int(\\\"0\\\")\", Value.INT_ZERO);\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecute_wrongCase() throws Exception {\n    assertFunctionException(\"str2int(true)\");\n    assertFunctionException(\"str2int(0.3)\");\n    assertFunctionException(\"str2int(1,2)\");\n    assertDestinationFolderEmpty();\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"str2int\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.INT, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2JAVATest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionSTR2JAVATest extends AbstractFunctionTest {\n\n  private static final FunctionSTR2JAVA HANDLER = new FunctionSTR2JAVA();\n\n  @Test\n  public void testExecution_NoSplit() throws Exception {\n    assertFunction(\"str2java(\\\"\\\",false)\", Value.valueOf(\"\"));\n    assertFunction(\"str2java(\\\"hello\\nworld\\\",false)\", Value.valueOf(\"hello\\\\nworld\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_Split() throws Exception {\n    assertFunction(\"str2java(\\\"\\\",true)\", Value.valueOf(\"\\\"\\\"\"));\n    assertFunction(\"str2java(\\\"hello\\nworld\\\",true)\",\n        Value.valueOf(\"\\\"hello\\\\n\\\"\" + PreprocessorUtils.getNextLineCodes() + \"+\\\"world\\\"\"));\n    assertFunction(\"str2java(\\\"hello\\nworld\\n\\\",true)\",\n        Value.valueOf(\"\\\"hello\\\\n\\\"\" + PreprocessorUtils.getNextLineCodes() + \"+\\\"world\\\\n\\\"\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"str2java()\");\n    assertFunctionException(\"str2java(1,2)\");\n    assertFunctionException(\"str2java(true)\");\n    assertFunctionException(\"str2java(true,\\\"ss\\\")\");\n    assertFunctionException(\"str2java(\\\"ss\\\",3)\");\n    assertDestinationFolderEmpty();\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"str2java\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(2), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING, ValueType.BOOLEAN)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2JSONTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionSTR2JSONTest extends AbstractFunctionTest {\n\n  private static final FunctionSTR2JSON HANDLER = new FunctionSTR2JSON();\n\n  @Test\n  public void testExecution_Str() throws Exception {\n    assertFunction(\"str2json(\\\"\\\\\\\"hmm\\\\\\\"\\\")\", Value.valueOf(\"\\\\\\\"hmm\\\\\\\"\"));\n    assertFunction(\"str2json(\\\"33\\\")\", Value.valueOf(\"33\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"str2json()\");\n    assertFunctionException(\"str2json(1,2)\");\n    assertFunctionException(\"str2json(true)\");\n    assertFunctionException(\"str2json(3)\");\n    assertDestinationFolderEmpty();\n\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"str2json\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2JSTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionSTR2JSTest extends AbstractFunctionTest {\n\n  private static final FunctionSTR2JS HANDLER = new FunctionSTR2JS();\n\n  @Test\n  public void testExecution_Str() throws Exception {\n    assertFunction(\"str2js(\\\"\\\\\\\"1,2\\\\\\\"\\\")\", Value.valueOf(\"\\\\\\\"1,2\\\\\\\"\"));\n    assertFunction(\"str2js(\\\"33\\\")\", Value.valueOf(\"33\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"str2js()\");\n    assertFunctionException(\"str2js(1,2)\");\n    assertFunctionException(\"str2js(true)\");\n    assertFunctionException(\"str2js(3)\");\n    assertDestinationFolderEmpty();\n\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"str2js\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2WEBTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionSTR2WEBTest extends AbstractFunctionTest {\n\n  private static final FunctionSTR2WEB HANDLER = new FunctionSTR2WEB();\n\n  @Test\n  public void testExecution_Str() throws Exception {\n    assertFunction(\"str2web(\\\"<hello>\\\")\", Value.valueOf(\"&lt;hello&gt;\"));\n    assertFunction(\"str2web(\\\"<привет>\\\")\",\n        Value.valueOf(\"&lt;&#1087;&#1088;&#1080;&#1074;&#1077;&#1090;&gt;\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"str2web()\");\n    assertFunctionException(\"str2web(1,2)\");\n    assertFunctionException(\"str2web(true)\");\n    assertFunctionException(\"str2web(3)\");\n    assertDestinationFolderEmpty();\n\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"str2web\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionSTR2XMLTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionSTR2XMLTest extends AbstractFunctionTest {\n\n  private static final FunctionSTR2XML HANDLER = new FunctionSTR2XML();\n\n  @Test\n  public void testExecution_Str() throws Exception {\n    assertFunction(\"str2xml(\\\"<12/>\\\")\", Value.valueOf(\"&lt;12/&gt;\"));\n    assertFunction(\"str2xml(\\\"33\\\")\", Value.valueOf(\"33\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"str2xml()\");\n    assertFunctionException(\"str2xml(1,2)\");\n    assertFunctionException(\"str2xml(true)\");\n    assertFunctionException(\"str2xml(3)\");\n    assertDestinationFolderEmpty();\n\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"str2xml\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionSTRLENTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionSTRLENTest extends AbstractFunctionTest {\n\n  private static final FunctionSTRLEN HANDLER = new FunctionSTRLEN();\n\n  @Test\n  public void testExecution_Str() throws Exception {\n    assertFunction(\"strlen(\\\"hello world\\\")\", Value.valueOf(11L));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"strlen()\");\n    assertFunctionException(\"strlen(11)\");\n    assertFunctionException(\"strlen(true)\");\n    assertFunctionException(\"strlen(1,2)\");\n    assertFunctionException(\"strlen(,)\");\n    assertDestinationFolderEmpty();\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"strlen\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.INT, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/FunctionTRIMLINESTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionTRIMLINESTest extends AbstractFunctionTest {\n\n  private static final FunctionTRIMLINES HANDLER = new FunctionTRIMLINES();\n\n  @Test\n  public void testExecution_WorkingCases() throws Exception {\n    assertFunction(\"trimlines(\\\"\\\")\", Value.valueOf(\"\"));\n    assertFunction(\"trimlines(\\\"hello world\\\")\", Value.valueOf(\"hello world\"));\n    assertFunction(\"trimlines(\\\"  hello   \\n   \\n   world\\n\\\")\",\n        Value.valueOf(\"hello\" + PreprocessorUtils.getNextLineCodes() + \"world\"));\n    assertDestinationFolderEmpty();\n  }\n\n  @Test\n  public void testExecution_wrongCases() throws Exception {\n    assertFunctionException(\"trimlines()\");\n    assertFunctionException(\"trimlines(1)\");\n    assertFunctionException(\"trimlines(true)\");\n    assertFunctionException(\"trimlines(true,\\\"ss\\\")\");\n    assertFunctionException(\"trimlines(\\\"ss\\\",3)\");\n    assertDestinationFolderEmpty();\n\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"trimlines\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/AbstractFunctionXMLTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.mockito.Mockito.any;\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.spy;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.functions.AbstractFunctionTest;\nimport java.io.File;\nimport org.junit.Before;\nimport org.mockito.stubbing.Answer;\n\npublic abstract class AbstractFunctionXMLTest extends AbstractFunctionTest {\n\n  protected PreprocessorContext SPY_CONTEXT;\n  protected Value OPENED_DOCUMENT_ID;\n  protected Value OPENED_DOCUMENT_ROOT;\n\n  @Before\n  public void initTest() throws Exception {\n    SPY_CONTEXT = spy(new PreprocessorContext(new File(\"some_impossible_folder_121212\")));\n    final File thisRoot = new File(this.getClass().getResource(\"./\").toURI());\n\n    doAnswer((Answer<Object>) invocation -> {\n      final String name = (String) invocation.getArguments()[0];\n      return new File(thisRoot, name);\n    }).when(SPY_CONTEXT).findFileInSources(any(String.class));\n\n    OPENED_DOCUMENT_ID = new FunctionXML_OPEN().executeStr(SPY_CONTEXT, Value.valueOf(\"test.xml\"));\n    OPENED_DOCUMENT_ROOT = new FunctionXML_ROOT().executeStr(SPY_CONTEXT, OPENED_DOCUMENT_ID);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_ATTRTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionXML_ATTRTest extends AbstractFunctionXMLTest {\n\n  private static final FunctionXML_ATTR HANDLER = new FunctionXML_ATTR();\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_WrongAttributeName() throws Exception {\n    HANDLER.executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ID, Value.valueOf(\"lasjdlksajdlksajdlksad\"));\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_WrongElementId() throws Exception {\n    HANDLER.executeStrStr(SPY_CONTEXT, Value.valueOf(\"kajshdjksaoiqweqwjdsa\"),\n        Value.valueOf(\"test\"));\n  }\n\n  @Test\n  public void testExecution_ExistsAttribute() throws Exception {\n    assertEquals(\"hello\",\n        HANDLER.executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ROOT, Value.valueOf(\"attr\")).asString());\n  }\n\n  @Test\n  public void testExecution_nonExistsAttribute() throws Exception {\n    assertEquals(\"\",\n        HANDLER.executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ROOT, Value.valueOf(\"hhhmattr\"))\n            .asString());\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"xml_attr\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(2), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING, ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_GETTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport com.igormaznitsa.jcp.expression.functions.AbstractFunction;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class FunctionXML_GETTest extends AbstractFunctionXMLTest {\n\n  private static final FunctionXML_GET HANDLER = new FunctionXML_GET();\n  private static final FunctionXML_TEXT GETTEXT = new FunctionXML_TEXT();\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_WrongElementId() throws Exception {\n    HANDLER.executeStrInt(SPY_CONTEXT, Value.valueOf(\"12qwewqe\"), Value.INT_ZERO);\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_WrongIndex() throws Exception {\n    final Value elementList =\n        new FunctionXML_LIST().executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ROOT,\n            Value.valueOf(\"element\"));\n    HANDLER.executeStrInt(SPY_CONTEXT, elementList, Value.valueOf(Long.valueOf(-1)));\n  }\n\n  @Test\n  public void testExecution() throws Exception {\n    final Value elementList =\n        new FunctionXML_LIST().executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ROOT,\n            Value.valueOf(\"element\"));\n    assertEquals(\"elem1\", GETTEXT.executeStr(SPY_CONTEXT,\n        HANDLER.executeStrInt(SPY_CONTEXT, elementList, Value.INT_ZERO)).asString());\n    assertEquals(\"elem2\", GETTEXT.executeStr(SPY_CONTEXT,\n        HANDLER.executeStrInt(SPY_CONTEXT, elementList, Value.INT_ONE)).asString());\n    assertEquals(\"elem3\", GETTEXT.executeStr(SPY_CONTEXT,\n        HANDLER.executeStrInt(SPY_CONTEXT, elementList, Value.INT_TWO)).asString());\n    assertEquals(\"<test>\", GETTEXT.executeStr(SPY_CONTEXT,\n        HANDLER.executeStrInt(SPY_CONTEXT, elementList, Value.INT_THREE)).asString());\n    final Value elementList2 =\n        new FunctionXML_LIST().executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ROOT,\n            Value.valueOf(\"element\"));\n    assertEquals(\"elem1\", GETTEXT.executeStr(SPY_CONTEXT,\n        HANDLER.executeStrInt(SPY_CONTEXT, elementList2, Value.INT_ZERO)).asString());\n    assertEquals(\"elem2\", GETTEXT.executeStr(SPY_CONTEXT,\n        HANDLER.executeStrInt(SPY_CONTEXT, elementList2, Value.INT_ONE)).asString());\n    assertEquals(\"elem3\", GETTEXT.executeStr(SPY_CONTEXT,\n        HANDLER.executeStrInt(SPY_CONTEXT, elementList2, Value.INT_TWO)).asString());\n    assertEquals(\"<test>\", GETTEXT.executeStr(SPY_CONTEXT,\n        HANDLER.executeStrInt(SPY_CONTEXT, elementList2, Value.INT_THREE)).asString());\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"xml_get\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(AbstractFunction.ARITY_2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING, ValueType.INT)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_LISTTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionXML_LISTTest extends AbstractFunctionXMLTest {\n\n  private static final FunctionXML_LIST HANDLER = new FunctionXML_LIST();\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_ForWrongElement() throws Exception {\n    assertNotNull(\n        HANDLER.executeStrStr(SPY_CONTEXT, Value.valueOf(\"some wrong\"), Value.valueOf(\"nonexist\")));\n  }\n\n  @Test\n  public void testExecution_ForNonExistElements() throws Exception {\n    assertNotNull(\n        HANDLER.executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ROOT, Value.valueOf(\"nonexist\")));\n  }\n\n  @Test\n  public void testExecution_ForExistElements() throws Exception {\n    assertNotNull(\n        HANDLER.executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ROOT, Value.valueOf(\"element\")));\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"xml_list\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(2), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING, ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_NAMETest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionXML_NAMETest extends AbstractFunctionXMLTest {\n\n  private static final FunctionXML_NAME HANDLER = new FunctionXML_NAME();\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_WrongElementId() throws Exception {\n    HANDLER.executeStr(SPY_CONTEXT, Value.valueOf(\"nonexistelementaaaaaaaaaaa\"));\n  }\n\n  @Test\n  public void testExecution_RootElement() throws Exception {\n    assertEquals(\"root\", HANDLER.executeStr(SPY_CONTEXT, OPENED_DOCUMENT_ROOT).asString());\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"xml_name\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_OPENTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionXML_OPENTest extends AbstractFunctionXMLTest {\n\n  private static final FunctionXML_OPEN HANDLER = new FunctionXML_OPEN();\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecute_FileNotFound() throws Exception {\n    HANDLER.executeStr(SPY_CONTEXT, Value.valueOf(\"unknown_file.xxxxml\"));\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecute_NoXMLFile() throws Exception {\n    HANDLER.executeStr(SPY_CONTEXT, Value.valueOf(\"noxml.txt\"));\n  }\n\n  @Test\n  public void testExecute() throws Exception {\n    HANDLER.executeStr(SPY_CONTEXT, Value.valueOf(\"test.xml\"));\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"xml_open\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_ROOTTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionXML_ROOTTest extends AbstractFunctionXMLTest {\n\n  private static final FunctionXML_ROOT HANDLER = new FunctionXML_ROOT();\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_WrongDocId() throws Exception {\n    HANDLER.executeStr(SPY_CONTEXT, Value.valueOf(\"jlskjlasjdsa123213213\"));\n  }\n\n  @Test\n  public void testExecution() throws Exception {\n    assertEquals(OPENED_DOCUMENT_ID.asString() + \"_#root\",\n        HANDLER.executeStr(SPY_CONTEXT, OPENED_DOCUMENT_ID).asString());\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"xml_root\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_SIZETest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionXML_SIZETest extends AbstractFunctionXMLTest {\n\n  private static final FunctionXML_SIZE HANDLER = new FunctionXML_SIZE();\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_WrongElementListID() throws Exception {\n    HANDLER.executeStr(SPY_CONTEXT, Value.valueOf(\"ieqoidqoiuoiq\"));\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_WrongElementType() throws Exception {\n    HANDLER.executeStr(SPY_CONTEXT, OPENED_DOCUMENT_ID);\n  }\n\n  @Test\n  public void testExecution() throws Exception {\n    final Value languageElement = new FunctionXML_GET().executeStrInt(SPY_CONTEXT,\n        new FunctionXML_LIST().executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ROOT,\n            Value.valueOf(\"languages\")), Value.valueOf(0L));\n    final Value elementList = new FunctionXML_LIST().executeStrStr(SPY_CONTEXT, languageElement,\n        Value.valueOf(\"language\"));\n    assertNotNull(elementList);\n    assertEquals(6L, HANDLER.executeStr(SPY_CONTEXT, elementList).asLong().longValue());\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"xml_size\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.INT, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_TEXTTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionXML_TEXTTest extends AbstractFunctionXMLTest {\n\n  private static final FunctionXML_TEXT HANDLER = new FunctionXML_TEXT();\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_IncompatibleCachedObjectId() throws Exception {\n    HANDLER.executeStr(SPY_CONTEXT, OPENED_DOCUMENT_ID);\n  }\n\n  @Test\n  public void testExecution() throws Exception {\n    final Value elements = HANDLER.executeStr(SPY_CONTEXT,\n        new FunctionXML_XELEMENT().executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ID,\n            Value.valueOf(\"/root/languages\")));\n    assertEquals(\"rustext\\n  gertext\\n  esttext\\n  fintext\\n  frtext\\n  ittext\",\n        elements.asString().trim());\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"xml_text\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(1), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_XELEMENTTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionXML_XELEMENTTest extends AbstractFunctionXMLTest {\n\n  private static final FunctionXML_XELEMENT HANDLER = new FunctionXML_XELEMENT();\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_ForWrongElement() throws Exception {\n    assertNotNull(\n        HANDLER.executeStrStr(SPY_CONTEXT, Value.valueOf(\"some wrong\"), Value.valueOf(\"nonexist\")));\n  }\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_NonExistElement() throws Exception {\n    HANDLER.executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ID, Value.valueOf(\"/root/nonexist\"));\n  }\n\n  @Test\n  public void testExecution_ForExistElements() throws Exception {\n    final Value value =\n        HANDLER.executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ID, Value.valueOf(\"/root/element\"));\n    assertNotNull(value);\n    assertEquals(\"first\",\n        new FunctionXML_ATTR().executeStrStr(SPY_CONTEXT, value, Value.valueOf(\"attr\")).asString());\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"xml_xelement\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(2), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING, ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/functions/xml/FunctionXML_XLISTTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.functions.xml;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.expression.ValueType;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class FunctionXML_XLISTTest extends AbstractFunctionXMLTest {\n\n  private static final FunctionXML_XLIST HANDLER = new FunctionXML_XLIST();\n\n  @Test(expected = PreprocessorException.class)\n  public void testExecution_ForWrongElement() throws Exception {\n    assertNotNull(\n        HANDLER.executeStrStr(SPY_CONTEXT, Value.valueOf(\"some wrong\"), Value.valueOf(\"nonexist\")));\n  }\n\n  @Test\n  public void testExecution_NonExistElement() throws Exception {\n    final Value value =\n        HANDLER.executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ID, Value.valueOf(\"/root/nonexist\"));\n    assertNotNull(value);\n    assertEquals(0, new FunctionXML_SIZE().executeStr(SPY_CONTEXT, value).asLong().intValue());\n  }\n\n  @Test\n  public void testExecution_ForExistElements() throws Exception {\n    final Value value =\n        HANDLER.executeStrStr(SPY_CONTEXT, OPENED_DOCUMENT_ID, Value.valueOf(\"/root/element\"));\n    assertNotNull(value);\n    assertEquals(4, new FunctionXML_SIZE().executeStr(SPY_CONTEXT, value).asLong().intValue());\n  }\n\n  @Override\n  public void testName() {\n    assertEquals(\"xml_xlist\", HANDLER.getName());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(Set.of(2), HANDLER.getArity());\n  }\n\n  @Override\n  public void testAllowedArgumentTypes() {\n    assertAllowedArguments(HANDLER, List.of(List.of(ValueType.STRING, ValueType.STRING)));\n  }\n\n  @Override\n  public void testResultType() {\n    assertEquals(ValueType.STRING, HANDLER.getResultType());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/AbstractOperatorTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.AbstractSpyPreprocessorContextTest;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Expression;\nimport com.igormaznitsa.jcp.expression.Value;\nimport org.junit.Test;\n\npublic abstract class AbstractOperatorTest extends AbstractSpyPreprocessorContextTest {\n\n  @Test\n  public abstract void testKeyword();\n\n  @Test\n  public abstract void testReference();\n\n  @Test\n  public abstract void testArity();\n\n  @Test\n  public abstract void testPriority();\n\n  @Test\n  public abstract void testExecution() throws Exception;\n\n  @Test\n  public abstract void testExecution_PreprocessorException() throws Exception;\n\n  public void assertReference(final AbstractOperator operator) {\n    final String reference = operator.getReference();\n    assertNotNull(\"The reference must not be null\", reference);\n    assertFalse(\"The reference must not be empty\", reference.isEmpty());\n    assertTrue(\"The reference must be longer that 7 chars\", reference.length() > 7);\n  }\n\n  public PreprocessorContext assertExecution(final Value expectedResult, final String expression)\n      throws Exception {\n    final PreprocessorContext context = preparePreprocessorContext(getCurrentTestFolder());\n    assertEquals(\"The expression result must be equal to the expected one\", expectedResult,\n        Expression.evalExpression(expression, context));\n    return context;\n  }\n\n  public void assertPreprocessorException(final String expression) {\n    try {\n      assertExecution(Value.INT_ZERO, expression);\n      fail(\"Must throw PE\");\n    } catch (PreprocessorException expected) {\n    } catch (Exception unexpected) {\n      unexpected.printStackTrace();\n      fail(\"Unexpected exception detected, must be you have a program error\");\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorADDTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\nimport org.junit.Test;\n\npublic class OperatorADDTest extends AbstractOperatorTest {\n\n  private static final OperatorADD HANDLER = new OperatorADD();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.valueOf(Long.valueOf(11)), \"3+8\");\n    assertExecution(Value.valueOf(\"helloworld\"), \"\\\"hello\\\"+\\\"world\\\"\");\n    assertExecution(Value.valueOf(2.2f), \"1.2+1\");\n    assertExecution(Value.valueOf(\"1test\"), \"1+\\\"test\\\"\");\n    assertExecution(Value.valueOf(\"1.2test\"), \"1.2+\\\"test\\\"\");\n  }\n\n  @Test\n  public void testExecution_chain() throws Exception {\n    assertExecution(Value.valueOf(\"1.2.3\"), \"1+\\\".\\\"+2+\\\".\\\"+3\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"+\");\n    assertPreprocessorException(\"+1\");\n    assertPreprocessorException(\"2+\");\n    assertPreprocessorException(\"true+false\");\n    assertPreprocessorException(\"1+true\");\n    assertPreprocessorException(\"2.3+false\");\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"+\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.ARITHMETIC_ADD_SUB, HANDLER.getExpressionItemPriority());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorANDTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\nimport org.junit.Test;\n\npublic class OperatorANDTest extends AbstractOperatorTest {\n\n  private static final OperatorAND HANDLER = new OperatorAND();\n\n  @Test\n  public void testExecution() throws Exception {\n    assertExecution(Value.valueOf(1L), \"3 && 1\");\n    assertExecution(Value.valueOf(0L), \"1 && 0\");\n    assertExecution(Value.valueOf(1L), \"1 && 3\");\n\n    assertExecution(Value.valueOf(Boolean.TRUE), \"true && true\");\n    assertExecution(Value.valueOf(Boolean.FALSE), \"false && true\");\n    assertExecution(Value.valueOf(Boolean.FALSE), \"true && false\");\n    assertExecution(Value.valueOf(Boolean.FALSE), \"false && false\");\n    assertExecution(Value.valueOf(Boolean.FALSE), \"false && false && true\");\n    assertExecution(Value.valueOf(Boolean.TRUE), \"true && true && true\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"&&\");\n    assertPreprocessorException(\"true &&\");\n    assertPreprocessorException(\"&& false\");\n    assertPreprocessorException(\"\\\"test\\\" && true\");\n    assertPreprocessorException(\"false && 1.3\");\n  }\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"&&\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.LOGICAL, HANDLER.getExpressionItemPriority());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorDIVTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\nimport org.junit.Test;\n\npublic class OperatorDIVTest extends AbstractOperatorTest {\n\n  private static final OperatorDIV HANDLER = new OperatorDIV();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.valueOf(5L), \"10/2\");\n    assertExecution(Value.valueOf(1.5f), \"3.0/2\");\n    assertExecution(Value.valueOf(1L), \"3/2\");\n  }\n\n  @Test\n  public void testExecution_chain() throws Exception {\n    assertExecution(Value.valueOf(8L), \"160/4/5\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() {\n    assertPreprocessorException(\"/\");\n    assertPreprocessorException(\"1/\");\n    assertPreprocessorException(\"/2.2\");\n    assertPreprocessorException(\"1/true\");\n    assertPreprocessorException(\"false/3\");\n    assertPreprocessorException(\"\\\"hello\\\"/2.2\");\n    assertPreprocessorException(\"1/\\\"hello\\\"\");\n  }\n\n  @Test(expected = ArithmeticException.class)\n  public void testExecution_arithmeticException() throws Exception {\n    assertExecution(Value.INT_ZERO, \"1/0\");\n  }\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"/\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.ARITHMETIC_MUL_DIV_MOD,\n        HANDLER.getExpressionItemPriority());\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorEQUTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class OperatorEQUTest extends AbstractOperatorTest {\n\n  private static final OperatorEQU HANDLER = new OperatorEQU();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.BOOLEAN_TRUE, \"true==true\");\n    assertExecution(Value.BOOLEAN_FALSE, \"false==true\");\n    assertExecution(Value.BOOLEAN_FALSE, \"true==false\");\n    assertExecution(Value.BOOLEAN_FALSE, \"1==0\");\n    assertExecution(Value.BOOLEAN_TRUE, \"2==2\");\n    assertExecution(Value.BOOLEAN_TRUE, \"2.4==2.4\");\n    assertExecution(Value.BOOLEAN_TRUE, \"0x443==1091\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1091==0x443\");\n    assertExecution(Value.BOOLEAN_TRUE, \"\\\"test\\\"==\\\"test\\\"\");\n    assertExecution(Value.BOOLEAN_FALSE, \"\\\"test\\\"==\\\"test2\\\"\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1==1.0\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"true==1\");\n    assertPreprocessorException(\"==\");\n    assertPreprocessorException(\"1==\");\n    assertPreprocessorException(\"==1\");\n  }\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"==\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.COMPARISON, HANDLER.getExpressionItemPriority());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorGREATEQUTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class OperatorGREATEQUTest extends AbstractOperatorTest {\n\n  private static final OperatorGREATEQU HANDLER = new OperatorGREATEQU();\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\">=\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.COMPARISON, HANDLER.getExpressionItemPriority());\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.BOOLEAN_TRUE, \"1>=0\");\n    assertExecution(Value.BOOLEAN_TRUE, \"0>=0\");\n    assertExecution(Value.BOOLEAN_TRUE, \"\\\"test\\\">=\\\"t\\\"\");\n    assertExecution(Value.BOOLEAN_TRUE, \"\\\"test\\\">=\\\"test\\\"\");\n    assertExecution(Value.BOOLEAN_FALSE, \"\\\"t\\\">=\\\"test\\\"\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1.2>=1.1\");\n    assertExecution(Value.BOOLEAN_FALSE, \"1.5>=2.3\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1.5>=1.5\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\">=\");\n    assertPreprocessorException(\"1>=\");\n    assertPreprocessorException(\">=0\");\n    assertPreprocessorException(\"true>=\\\"test\\\"\");\n    assertPreprocessorException(\"true>=1\");\n    assertPreprocessorException(\"2.3>=\\\"test\\\"\");\n    assertPreprocessorException(\"2.3>=false\");\n    assertPreprocessorException(\"true>=false\");\n    assertPreprocessorException(\"1>=false\");\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorGREATTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class OperatorGREATTest extends AbstractOperatorTest {\n\n  private static final OperatorGREAT HANDLER = new OperatorGREAT();\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\">\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.COMPARISON, HANDLER.getExpressionItemPriority());\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.BOOLEAN_TRUE, \"1>0\");\n    assertExecution(Value.BOOLEAN_FALSE, \"0>0\");\n    assertExecution(Value.BOOLEAN_TRUE, \"\\\"test\\\">\\\"t\\\"\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1.2>1.1\");\n    assertExecution(Value.BOOLEAN_FALSE, \"1.5>2.3\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\">\");\n    assertPreprocessorException(\"1>\");\n    assertPreprocessorException(\">0\");\n    assertPreprocessorException(\"true>\\\"test\\\"\");\n    assertPreprocessorException(\"true>1\");\n    assertPreprocessorException(\"2.3>\\\"test\\\"\");\n    assertPreprocessorException(\"2.3>false\");\n    assertPreprocessorException(\"true>false\");\n    assertPreprocessorException(\"1>false\");\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorLESSEQUTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class OperatorLESSEQUTest extends AbstractOperatorTest {\n\n  private static final OperatorLESSEQU HANDLER = new OperatorLESSEQU();\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"<=\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.COMPARISON, HANDLER.getExpressionItemPriority());\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.BOOLEAN_FALSE, \"1<=0\");\n    assertExecution(Value.BOOLEAN_TRUE, \"0<=0\");\n    assertExecution(Value.BOOLEAN_FALSE, \"\\\"test\\\"<=\\\"t\\\"\");\n    assertExecution(Value.BOOLEAN_TRUE, \"\\\"test\\\"<=\\\"test\\\"\");\n    assertExecution(Value.BOOLEAN_TRUE, \"\\\"t\\\"<=\\\"test\\\"\");\n    assertExecution(Value.BOOLEAN_FALSE, \"1.2<=1.1\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1.5<=2.3\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1.5<=1.5\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"<=\");\n    assertPreprocessorException(\"1<=\");\n    assertPreprocessorException(\"<=0\");\n    assertPreprocessorException(\"true<=\\\"test\\\"\");\n    assertPreprocessorException(\"true<=1\");\n    assertPreprocessorException(\"2.3<=\\\"test\\\"\");\n    assertPreprocessorException(\"2.3<=false\");\n    assertPreprocessorException(\"true<=false\");\n    assertPreprocessorException(\"1<=false\");\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorLESSTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class OperatorLESSTest extends AbstractOperatorTest {\n\n  private static final OperatorLESS HANDLER = new OperatorLESS();\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"<\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.COMPARISON, HANDLER.getExpressionItemPriority());\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.BOOLEAN_FALSE, \"1<0\");\n    assertExecution(Value.BOOLEAN_FALSE, \"0<0\");\n    assertExecution(Value.BOOLEAN_FALSE, \"\\\"test\\\"<\\\"t\\\"\");\n    assertExecution(Value.BOOLEAN_FALSE, \"1.2<1.1\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1.5<2.3\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"<\");\n    assertPreprocessorException(\"1<\");\n    assertPreprocessorException(\"<0\");\n    assertPreprocessorException(\"true<\\\"test\\\"\");\n    assertPreprocessorException(\"true<1\");\n    assertPreprocessorException(\"2.3<\\\"test\\\"\");\n    assertPreprocessorException(\"2.3<false\");\n    assertPreprocessorException(\"true<false\");\n    assertPreprocessorException(\"1<false\");\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorMODTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\nimport org.junit.Test;\n\npublic class OperatorMODTest extends AbstractOperatorTest {\n\n  private static final OperatorMOD HANDLER = new OperatorMOD();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.valueOf(3L), \"3%8\");\n    assertExecution(Value.valueOf(2L), \"8%3\");\n    assertExecution(Value.valueOf(2.5f % 1.1f), \"2.5%1.1\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"%\");\n    assertPreprocessorException(\"%1\");\n    assertPreprocessorException(\"2%\");\n    assertPreprocessorException(\"true%false\");\n    assertPreprocessorException(\"1%true\");\n  }\n\n  @Test(expected = ArithmeticException.class)\n  public void testExecution_arithmeticException() throws Exception {\n    assertExecution(Value.INT_ZERO, \"3%0\");\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"%\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.ARITHMETIC_MUL_DIV_MOD,\n        HANDLER.getExpressionItemPriority());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorMULTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\nimport org.junit.Test;\n\npublic class OperatorMULTest extends AbstractOperatorTest {\n\n  private static final OperatorMUL HANDLER = new OperatorMUL();\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.valueOf(24L), \"3*8\");\n    assertExecution(Value.valueOf(2.5f * 1.1f), \"2.5*1.1\");\n  }\n\n  @Test\n  public void testExecution_chain() throws Exception {\n    assertExecution(Value.valueOf(56L), \"2*4*7\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"*\");\n    assertPreprocessorException(\"*1\");\n    assertPreprocessorException(\"2*\");\n    assertPreprocessorException(\"true*false\");\n    assertPreprocessorException(\"1*true\");\n    assertPreprocessorException(\"1.3*true\");\n    assertPreprocessorException(\"false*1\");\n    assertPreprocessorException(\"false*1.1\");\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"*\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.ARITHMETIC_MUL_DIV_MOD,\n        HANDLER.getExpressionItemPriority());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorNOTEQUTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class OperatorNOTEQUTest extends AbstractOperatorTest {\n\n  private static final OperatorNOTEQU HANDLER = new OperatorNOTEQU();\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"!=\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.COMPARISON, HANDLER.getExpressionItemPriority());\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.BOOLEAN_TRUE, \"1!=0\");\n    assertExecution(Value.BOOLEAN_TRUE, \"true!=false\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1.3!=1.2\");\n    assertExecution(Value.BOOLEAN_TRUE, \"\\\"test\\\"!=\\\"test2\\\"\");\n    assertExecution(Value.BOOLEAN_FALSE, \"1.2!=1.2\");\n    assertExecution(Value.BOOLEAN_FALSE, \"1!=1\");\n    assertExecution(Value.BOOLEAN_FALSE, \"true!=true\");\n    assertExecution(Value.BOOLEAN_FALSE, \"\\\"test\\\"!=\\\"test\\\"\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1!=1.2\");\n    assertExecution(Value.BOOLEAN_TRUE, \"1.2!=1\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"!=\");\n    assertPreprocessorException(\"true!=\");\n    assertPreprocessorException(\"!=2\");\n    assertPreprocessorException(\"true!=\\\"hello\\\"\");\n    assertPreprocessorException(\"true!=1.2\");\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorNOTTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class OperatorNOTTest extends AbstractOperatorTest {\n\n  private static final OperatorNOT HANDLER = new OperatorNOT();\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"!\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(1, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.FUNCTION, HANDLER.getExpressionItemPriority());\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.BOOLEAN_TRUE, \"!false\");\n    assertExecution(Value.BOOLEAN_FALSE, \"!true\");\n    assertExecution(Value.valueOf(0xFFFFFFFFFFFFFFFFL ^ 10L), \"!10\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"!\");\n//TODO        assertIllegalStateException(\"2!\");\n    assertPreprocessorException(\"!\\\"test\\\"\");\n    assertPreprocessorException(\"!3.2\");\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorORTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class OperatorORTest extends AbstractOperatorTest {\n\n  private static final OperatorOR HANDLER = new OperatorOR();\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"||\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.LOGICAL, HANDLER.getExpressionItemPriority());\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.BOOLEAN_FALSE, \"false||false\");\n    assertExecution(Value.BOOLEAN_TRUE, \"true||false\");\n    assertExecution(Value.BOOLEAN_TRUE, \"false||true\");\n    assertExecution(Value.BOOLEAN_TRUE, \"true||true\");\n    assertExecution(Value.valueOf(3L), \"1||2\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"||\");\n    assertPreprocessorException(\"true||\");\n    assertPreprocessorException(\"\\\"test\\\"||true\");\n    assertPreprocessorException(\"true||1\");\n    assertPreprocessorException(\"1.2||1.1\");\n    assertPreprocessorException(\"||false\");\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorSUBTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class OperatorSUBTest extends AbstractOperatorTest {\n\n  private static final OperatorSUB HANDLER = new OperatorSUB();\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"-\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.ARITHMETIC_ADD_SUB, HANDLER.getExpressionItemPriority());\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.INT_ZERO, \"10-10\");\n    assertExecution(Value.INT_THREE, \"7-4\");\n    assertExecution(Value.valueOf(1.5f - 1.2f), \"1.5-1.2\");\n    assertExecution(Value.valueOf(1.0f - 1.2f), \"1-1.2\");\n    assertExecution(Value.valueOf(-1.2f), \"-1.2\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"-\");\n//TODO        assertIllegalStateException(\"1-\");\n    assertPreprocessorException(\"1-\\\"test\\\"\");\n    assertPreprocessorException(\"1-true\");\n    assertPreprocessorException(\"true-1\");\n    assertPreprocessorException(\"true-1.1\");\n    assertPreprocessorException(\"true-false\");\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/expression/operators/OperatorXORTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.expression.operators;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.expression.ExpressionItemPriority;\nimport com.igormaznitsa.jcp.expression.Value;\n\npublic class OperatorXORTest extends AbstractOperatorTest {\n\n  private static final OperatorXOR HANDLER = new OperatorXOR();\n\n  @Override\n  public void testKeyword() {\n    assertEquals(\"^\", HANDLER.getKeyword());\n  }\n\n  @Override\n  public void testReference() {\n    assertReference(HANDLER);\n  }\n\n  @Override\n  public void testArity() {\n    assertEquals(2, HANDLER.getArity());\n  }\n\n  @Override\n  public void testPriority() {\n    assertEquals(ExpressionItemPriority.LOGICAL, HANDLER.getExpressionItemPriority());\n  }\n\n  @Override\n  public void testExecution() throws Exception {\n    assertExecution(Value.INT_ZERO, Long.MAX_VALUE + \"^\" + Long.MAX_VALUE);\n    assertExecution(Value.BOOLEAN_FALSE, \"false^false\");\n    assertExecution(Value.BOOLEAN_TRUE, \"false^true\");\n    assertExecution(Value.BOOLEAN_TRUE, \"true^false\");\n    assertExecution(Value.BOOLEAN_FALSE, \"true^true\");\n  }\n\n  @Override\n  public void testExecution_PreprocessorException() throws Exception {\n    assertPreprocessorException(\"^\");\n    assertPreprocessorException(\"1^\");\n    assertPreprocessorException(\"^2\");\n    assertPreprocessorException(\"\\\"test\\\"^1\");\n    assertPreprocessorException(\"1.3^1\");\n    assertPreprocessorException(\"2^\\\"test\\\"\");\n    assertPreprocessorException(\"2^1.2\");\n    assertPreprocessorException(\"2.1^1.2\");\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/maven/MavenPropertiesImporterTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.maven;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.apache.maven.artifact.Artifact;\nimport org.apache.maven.project.MavenProject;\nimport org.junit.Test;\nimport org.mockito.Mockito;\n\npublic class MavenPropertiesImporterTest {\n\n  @Test\n  public void testNormalizeGetter() {\n    assertEquals(\"getHelloWorld\", MavenPropertiesImporter.normalizeGetter(\"helloWorld\"));\n  }\n\n  @Test\n  public void testRequestProperty() throws Exception {\n    final String property = \"project.artifact.dependencyConflictId\";\n\n    final MavenProject mockProject = Mockito.mock(MavenProject.class);\n    final Artifact mockArtifact = Mockito.mock(Artifact.class);\n\n    Mockito.when(mockProject.getArtifact()).thenReturn(mockArtifact);\n    Mockito.when(mockArtifact.getDependencyConflictId()).thenReturn(\"nothing\");\n\n    assertEquals(\"nothing\", MavenPropertiesImporter.getProperty(mockProject, property));\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/maven/PreprocessMojoTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.maven;\n\nimport static org.junit.Assert.assertArrayEquals;\n\nimport com.igormaznitsa.jcp.context.CommentRemoverType;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport java.io.File;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport org.apache.maven.plugin.testing.AbstractMojoTestCase;\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\n\npublic final class PreprocessMojoTest extends AbstractMojoTestCase {\n\n  private static void assertArrayEqualsWithoutOrders(final Object[] array1, final Object[] array2) {\n    final List<Object> list1 = new ArrayList<>(Arrays.asList(array1));\n    final List<Object> list2 = new ArrayList<>(Arrays.asList(array2));\n\n    while (!list1.isEmpty() && !list2.isEmpty()) {\n      final Object list1obj = list1.get(0);\n      for (int i = 0; i < list2.size(); i++) {\n        if (list2.get(i).equals(list1obj)) {\n          list2.remove(i);\n          break;\n        }\n      }\n      list1.remove(0);\n    }\n\n    assertTrue(\"Different values in arrays\", list1.isEmpty() && list2.isEmpty());\n  }\n\n  @Before\n  @Override\n  protected void setUp() throws Exception {\n    super.setUp();\n  }\n\n  @After\n  @Override\n  protected void tearDown() throws Exception {\n    super.tearDown();\n  }\n\n  @Test\n  public void testConfiguration() throws Exception {\n    final File testPom = new File(this.getClass().getResource(\"test.pom.xml\").toURI());\n    assertTrue(\"Must be existing\", testPom.exists());\n    final PreprocessMojo mojo = (PreprocessMojo) lookupMojo(\"preprocess\", testPom);\n    assertNotNull(\"Must not be null\", mojo);\n\n    assertFalse(mojo.isSkip());\n    mojo.setSkip(true);\n    assertTrue(mojo.isSkip());\n\n    final PreprocessorContext context = mojo.makePreprocessorContext();\n\n    final String[] sources = context.getSources()\n        .stream()\n        .map(PreprocessorContext.SourceFolder::getAsString)\n        .toArray(String[]::new);\n\n    assertArrayEqualsWithoutOrders(new String[] {\"/\", \"/some\", \"/another/some\"}, sources);\n    assertEquals(\"destination_dir\", context.getTarget().getName());\n    assertArrayEqualsWithoutOrders(new String[] {\"xml\", \"html\"},\n        context.getExcludeExtensions().toArray());\n    assertArrayEqualsWithoutOrders(new String[] {\"java\", \"txt\"}, context.getExtensions().toArray());\n    assertEquals(StandardCharsets.UTF_16, context.getSourceEncoding());\n    assertEquals(StandardCharsets.US_ASCII, context.getTargetEncoding());\n    assertEquals(CommentRemoverType.KEEP_ALL, context.getKeepComments());\n    assertTrue(context.isVerbose());\n    assertTrue(context.isDryRun());\n    assertTrue(context.isClearTarget());\n    assertTrue(context.isKeepLines());\n    assertTrue(context.isCareForLastEol());\n    assertTrue(context.isDontOverwriteSameContent());\n    assertTrue(context.isAllowWhitespaces());\n    assertTrue(context.isPreserveIndents());\n    assertTrue(context.isKeepAttributes());\n    assertTrue(context.isUnknownVariableAsFalse());\n\n    assertArrayEquals(\n        Arrays.asList(\".git\", \".hg\", \"**/.cvs\", \"c:\\\\hello\\\\**\\\\world\").toArray(new String[0]),\n        context.getExcludeFolders().toArray(new String[0]));\n\n    final List<File> configFiles = context.getConfigFiles();\n    assertEquals(\"Must be two\", 2, configFiles.size());\n    assertEquals(\"Must be test1.cfg\", \"test1.cfg\", configFiles.get(0).getName());\n    assertEquals(\"Must be test2.cfg\", \"test2.cfg\", configFiles.get(1).getName());\n\n    assertEquals(\"Must be 3\", Value.INT_THREE, context.findVariableForName(\"globalvar1\", true));\n    assertEquals(\"Must be 'hello world'\", Value.valueOf(\"hello world\"),\n        context.findVariableForName(\"globalvar2\", true));\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/removers/AbstractCommentRemoverTest.java",
    "content": "package com.igormaznitsa.jcp.removers;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.fail;\n\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.io.StringReader;\nimport java.io.StringWriter;\nimport java.io.Writer;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Parameterized;\n\n@RunWith(Parameterized.class)\npublic abstract class AbstractCommentRemoverTest {\n  protected final boolean whiteSpaced;\n\n  public AbstractCommentRemoverTest(final boolean whiteSpaced) {\n    this.whiteSpaced = whiteSpaced;\n  }\n\n  @Parameterized.Parameters\n  public static Collection<Boolean> data() {\n    return Arrays.asList(Boolean.FALSE, Boolean.TRUE);\n  }\n\n  protected abstract AbstractCommentRemover makeCommentRemoverInstance(Reader reader, Writer writer,\n                                                                       boolean whiteSpaceAllowed);\n\n  public void assertCommentRemove(final String source, final String expected) {\n    final Reader sourceReader = new StringReader(source);\n    final Writer writer = new StringWriter();\n    final AbstractCommentRemover remover =\n        this.makeCommentRemoverInstance(sourceReader, writer, this.whiteSpaced);\n    try (Writer resultWriter = remover.process()) {\n      assertEquals(expected, resultWriter.toString());\n    } catch (IOException ex) {\n      fail(\"Unexpected error: \" + ex.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/removers/CStyleCommentsRemoverTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.removers;\n\nimport java.io.Reader;\nimport java.io.Writer;\nimport org.junit.Test;\n\npublic class CStyleCommentsRemoverTest extends AbstractCommentRemoverTest {\n\n  public CStyleCommentsRemoverTest(boolean whiteSpaced) {\n    super(whiteSpaced);\n  }\n\n  @Override\n  protected AbstractCommentRemover makeCommentRemoverInstance(final Reader reader,\n                                                              final Writer writer,\n                                                              final boolean whiteSpaceAllowed) {\n    return new CStyleCommentRemover(reader, writer, whiteSpaceAllowed);\n  }\n\n  @Test\n  public void testRemovingSingleStringComments() throws Exception {\n    this.assertCommentRemove(\n        \"class main() {\\n// hello world\\nSystem.out.println(\\\"hello // world\\\");// a comment\\n}\",\n        \"class main() {\\n\\nSystem.out.println(\\\"hello // world\\\");\\n}\");\n  }\n\n  @Test\n  public void testMultilineStringComments() throws Exception {\n    this.assertCommentRemove(\n        \"class main() {/**\\ntest\\n*/\\n\\n// hello world\\nSystem.out.println(\\\"hello /*ooo*/ world\\\");/* a comment*/\\n/*  aslajdhkajhdkqwiueyoqiweuoqwueoqwiue}\",\n        \"class main() {\\n\\n\\nSystem.out.println(\\\"hello /*ooo*/ world\\\");\\n\");\n  }\n\n  @Test\n  public void testMultipleStarsAtComments() throws Exception {\n    this.assertCommentRemove(\n        \"class main() {/**\\ntest\\n**/\\n\\n// hello world\\nSystem.out.println(/**** some *** comment** ***/\\\"hello /*ooo*/ world\\\"/**** some *** comment*/);/* a comment*/\\n/*  aslajdhkajhdkqwiueyoqiweuoqwueoqwiue}\",\n        \"class main() {\\n\\n\\nSystem.out.println(\\\"hello /*ooo*/ world\\\");\\n\");\n  }\n\n  @Test\n  public void testTabulation() throws Exception {\n    this.assertCommentRemove(\"\\thello world();//test\", \"\\thello world();\");\n  }\n\n  @Test\n  public void testJcpDirectivesInComments() throws Exception {\n    this.assertCommentRemove(\n        \"// hello world\\n//#if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n//#else\\nSystem.out.println(\\\"RELEASE\\\");\\n//#endif\\n// end\",\n        \"\\n\\nSystem.out.println(\\\"DEBUG\\\");\\n\\nSystem.out.println(\\\"RELEASE\\\");\\n\\n\"\n    );\n  }\n\n  @Test\n  public void testLineCommentInTheEnd() throws Exception {\n    this.assertCommentRemove(\"\\thello world();//test\\n//   Hello\", \"\\thello world();\\n\");\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/removers/JcpCommentLineRemoverTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.removers;\n\nimport java.io.Reader;\nimport java.io.Writer;\nimport org.junit.Test;\n\npublic class JcpCommentLineRemoverTest extends AbstractCommentRemoverTest {\n\n  public JcpCommentLineRemoverTest(boolean whiteSpaced) {\n    super(whiteSpaced);\n  }\n\n  @Override\n  protected AbstractCommentRemover makeCommentRemoverInstance(final Reader reader,\n                                                              final Writer writer,\n                                                              final boolean whiteSpaceAllowed) {\n    return new JcpCommentLineRemover(reader, writer, whiteSpaceAllowed);\n  }\n\n  @Test\n  public void testRemovingSingleStringComments() throws Exception {\n    this.assertCommentRemove(\n        \"class main() {\\n// hello world\\nSystem.out.println(\\\"hello // world\\\");// a comment\\n}\",\n        \"class main() {\\n// hello world\\nSystem.out.println(\\\"hello // world\\\");// a comment\\n}\"\n    );\n  }\n\n  @Test\n  public void testMultilineStringComments() throws Exception {\n    this.assertCommentRemove(\n        \"class main() {/**\\ntest\\n*/\\n\\n// hello world\\nSystem.out.println(\\\"hello /*ooo*/ world\\\");/* a comment*/\\n/*  aslajdhkajhdkqwiueyoqiweuoqwueoqwiue}\",\n        \"class main() {/**\\ntest\\n*/\\n\\n// hello world\\nSystem.out.println(\\\"hello /*ooo*/ world\\\");/* a comment*/\\n/*  aslajdhkajhdkqwiueyoqiweuoqwueoqwiue}\"\n    );\n  }\n\n  @Test\n  public void testMultipleStarsAtComments() throws Exception {\n    this.assertCommentRemove(\n        \"class main() {/**\\ntest\\n**/\\n\\n// hello world\\nSystem.out.println(/**** some *** comment** ***/\\\"hello /*ooo*/ world\\\"/**** some *** comment*/);/* a comment*/\\n/*  aslajdhkajhdkqwiueyoqiweuoqwueoqwiue}\",\n        \"class main() {/**\\ntest\\n**/\\n\\n// hello world\\nSystem.out.println(/**** some *** comment** ***/\\\"hello /*ooo*/ world\\\"/**** some *** comment*/);/* a comment*/\\n/*  aslajdhkajhdkqwiueyoqiweuoqwueoqwiue}\"\n    );\n  }\n\n  @Test\n  public void testTabulation() throws Exception {\n    this.assertCommentRemove(\n        \"\\thello world();//test\",\n        \"\\thello world();//test\"\n    );\n  }\n\n  @Test\n  public void testJcpDirectivesInComments() throws Exception {\n    this.assertCommentRemove(\n        \"// hello world\\n//#if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n//#else\\nSystem.out.println(\\\"RELEASE\\\");\\n//#endif\\n// end\",\n        \"// hello world\\n\\nSystem.out.println(\\\"DEBUG\\\");\\n\\nSystem.out.println(\\\"RELEASE\\\");\\n\\n// end\"\n    );\n  }\n\n  @Test\n  public void testCommentedJcpDirective() throws Exception {\n    this.assertCommentRemove(\n        \"/** some multiline //$  //# test\\nwith jcp directives*/\\n//$ some\\n//$$$ some two\\n// hello world\\n////#if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n//#else\\nSystem.out.println(\\\"RELEASE\\\");\\n//#endif\\n// end\",\n        \"/** some multiline //$  //# test\\nwith jcp directives*/\\n\\n\\n// hello world\\n////#if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n\\nSystem.out.println(\\\"RELEASE\\\");\\n\\n// end\"\n    );\n\n    if (this.whiteSpaced) {\n      this.assertCommentRemove(\n          \"/** some multiline //$  //# test\\nwith jcp directives*/\\n//  $ some\\n//    $$$ some two\\n// hello world\\n////  #if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n//   # else\\nSystem.out.println(\\\"RELEASE\\\");\\n//   #endif\\n// end\",\n          \"/** some multiline //$  //# test\\nwith jcp directives*/\\n\\n\\n// hello world\\n////  #if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n\\nSystem.out.println(\\\"RELEASE\\\");\\n\\n// end\"\n      );\n    }\n  }\n\n  @Test\n  public void testCommentedJcpDirectiveAndJcpMarkedLines() throws Exception {\n    this.assertCommentRemove(\n        \"/\\n//\\n// JCP> test\\n//JCP test\\n//JCP! some jcp\\n/** some multiline //$  //# test\\nwith jcp directives*/\\n//$ some\\n//JCP> some line \\n//$$$ some two\\n// hello world\\n////#if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n//#else\\nSystem.out.println(\\\"RELEASE\\\");\\n//#endif\\n// end\\n//JCP\",\n        \"/\\n//\\n// JCP> test\\n//JCP test\\n\\n/** some multiline //$  //# test\\nwith jcp directives*/\\n\\n\\n\\n// hello world\\n////#if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n\\nSystem.out.println(\\\"RELEASE\\\");\\n\\n// end\\n//JCP\"\n    );\n\n    if (this.whiteSpaced) {\n      this.assertCommentRemove(\n          \"/\\n//\\n// JCP> test\\n//JCP test\\n//JCP! some jcp\\n/** some multiline //$  //# test\\nwith jcp directives*/\\n//  $ some\\n//JCP> some line \\n//    $$$ some two\\n// hello world\\n////  #if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n//   # else\\nSystem.out.println(\\\"RELEASE\\\");\\n//   #endif\\n// end\\n//JCP\",\n          \"/\\n//\\n// JCP> test\\n//JCP test\\n\\n/** some multiline //$  //# test\\nwith jcp directives*/\\n\\n\\n\\n// hello world\\n////  #if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n\\nSystem.out.println(\\\"RELEASE\\\");\\n\\n// end\\n//JCP\"\n      );\n    }\n  }\n\n  @Test\n  public void testLineCommentInTheEnd() throws Exception {\n    this.assertCommentRemove(\n        \"\\thello world();//test\\n//   Hello\",\n        \"\\thello world();//test\\n//   Hello\"\n    );\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/removers/JustCopyCommentsRemoverTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.removers;\n\nimport java.io.Reader;\nimport java.io.Writer;\nimport org.junit.Test;\n\npublic class JustCopyCommentsRemoverTest extends AbstractCommentRemoverTest {\n\n  public JustCopyCommentsRemoverTest(boolean whiteSpaced) {\n    super(whiteSpaced);\n  }\n\n  @Override\n  protected AbstractCommentRemover makeCommentRemoverInstance(final Reader reader,\n                                                              final Writer writer,\n                                                              final boolean whiteSpaceAllowed) {\n    return new JustCopyRemover(reader, writer, whiteSpaceAllowed);\n  }\n\n  @Test\n  public void testRemovingSingleStringComments() throws Exception {\n    this.assertCommentRemove(\n        \"class main() {\\n// hello world\\nSystem.out.println(\\\"hello // world\\\");// a comment\\n}\",\n        \"class main() {\\n// hello world\\nSystem.out.println(\\\"hello // world\\\");// a comment\\n}\"\n    );\n  }\n\n  @Test\n  public void testMultilineStringComments() throws Exception {\n    this.assertCommentRemove(\n        \"class main() {/**\\ntest\\n*/\\n\\n// hello world\\nSystem.out.println(\\\"hello /*ooo*/ world\\\");/* a comment*/\\n/*  aslajdhkajhdkqwiueyoqiweuoqwueoqwiue}\",\n        \"class main() {/**\\ntest\\n*/\\n\\n// hello world\\nSystem.out.println(\\\"hello /*ooo*/ world\\\");/* a comment*/\\n/*  aslajdhkajhdkqwiueyoqiweuoqwueoqwiue}\"\n    );\n  }\n\n  @Test\n  public void testMultipleStarsAtComments() throws Exception {\n    this.assertCommentRemove(\n        \"class main() {/**\\ntest\\n**/\\n\\n// hello world\\nSystem.out.println(/**** some *** comment** ***/\\\"hello /*ooo*/ world\\\"/**** some *** comment*/);/* a comment*/\\n/*  aslajdhkajhdkqwiueyoqiweuoqwueoqwiue}\",\n        \"class main() {/**\\ntest\\n**/\\n\\n// hello world\\nSystem.out.println(/**** some *** comment** ***/\\\"hello /*ooo*/ world\\\"/**** some *** comment*/);/* a comment*/\\n/*  aslajdhkajhdkqwiueyoqiweuoqwueoqwiue}\"\n    );\n  }\n\n  @Test\n  public void testTabulation() throws Exception {\n    this.assertCommentRemove(\n        \"\\thello world();//test\",\n        \"\\thello world();//test\"\n    );\n  }\n\n  @Test\n  public void testJcpDirectivesInComments() throws Exception {\n    this.assertCommentRemove(\n        \"// hello world\\n//#if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n//#else\\nSystem.out.println(\\\"RELEASE\\\");\\n//#endif\\n// end\",\n        \"// hello world\\n//#if DEBUG\\nSystem.out.println(\\\"DEBUG\\\");\\n//#else\\nSystem.out.println(\\\"RELEASE\\\");\\n//#endif\\n// end\"\n    );\n  }\n\n  @Test\n  public void testLineCommentInTheEnd() throws Exception {\n    this.assertCommentRemove(\n        \"\\thello world();//test\\n//   Hello\",\n        \"\\thello world();//test\\n//   Hello\"\n    );\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/AbortTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class AbortTest extends AbstractUseCaseTest {\n\n  @Override\n  protected void tuneContext(PreprocessorContext context) {\n    context.setCareForLastEol(true);\n  }\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(0, stat.getCopied());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/AbstractUseCaseTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static java.util.Objects.requireNonNull;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.io.File;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Collections;\nimport org.apache.commons.io.FileUtils;\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.rules.TemporaryFolder;\n\npublic abstract class AbstractUseCaseTest {\n\n  protected TemporaryFolder tmpResultFolder;\n  protected File sourceFolder;\n  protected File etalonFolder;\n\n  @Before\n  public void before() throws Exception {\n\n    final File testDir =\n        new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI());\n\n    final File base = new File(testDir, this.getClass().getName().replace('.', File.separatorChar));\n\n    final File simulationFolder = new File(testDir.getParentFile(), \"usecase_tests\");\n    if (!simulationFolder.isDirectory()) {\n      assertTrue(\"Can't make folders for simulation\", simulationFolder.mkdirs());\n    }\n\n    this.tmpResultFolder = new TemporaryFolder(simulationFolder);\n    this.tmpResultFolder.create();\n\n    this.sourceFolder = new File(base, \"src\");\n    this.etalonFolder = new File(base, \"etl\");\n  }\n\n  @After\n  public void after() throws Exception {\n    if (this.isDeleteTemporaryFolder()) {\n      try {\n        FileUtils.cleanDirectory(tmpResultFolder.getRoot());\n      } finally {\n        this.tmpResultFolder.delete();\n      }\n    }\n  }\n\n  public boolean isDeleteTemporaryFolder() {\n    return true;\n  }\n\n  public abstract void check(PreprocessorContext context, JcpPreprocessor.Statistics stat)\n      throws Exception;\n\n  private void assertFolder(final File etalonFolder, final File checkFolder,\n                            final boolean ignoreEOL)\n      throws Exception {\n    assertTrue(\"Etalon folder must be a folder\", etalonFolder.isDirectory());\n    assertTrue(\"Checked folder must be folder\", checkFolder.isDirectory());\n\n    final File[] etalonFolderFiles = requireNonNull(etalonFolder.listFiles());\n    final File[] checkFolderFiles = requireNonNull(checkFolder.listFiles());\n    assertEquals(\"Must have the same number of files and folders\", etalonFolderFiles.length,\n        checkFolderFiles.length);\n\n    for (final File etalonFile : etalonFolderFiles) {\n      final File checkFile = new File(checkFolder, etalonFile.getName());\n      if (!checkFile.exists()) {\n        fail(\"Can't find generated file :\" + checkFile.getAbsolutePath());\n      }\n      if (etalonFile.isFile() && !checkFile.isFile()) {\n        fail(\"Expected file: \" + checkFile.getAbsolutePath());\n      } else if (etalonFile.isDirectory()) {\n        if (!checkFile.isDirectory()) {\n          fail(\"Expected folder: \" + checkFile.getAbsolutePath());\n        } else {\n          assertFolder(etalonFile, checkFile, ignoreEOL);\n        }\n      } else {\n        if (ignoreEOL) {\n          final String[] etalonLines =\n              FileUtils.readFileToString(etalonFile, StandardCharsets.UTF_8).split(\"\\\\R\", -1);\n          final String[] checkLines =\n              FileUtils.readFileToString(checkFile, StandardCharsets.UTF_8).split(\"\\\\R\", -1);\n\n          if (etalonLines.length != checkLines.length) {\n            System.err.println(\n                \"----Etalon----\\n\" + String.join(System.lineSeparator(), etalonLines));\n            System.err.println(\n                \"----Checking----\\n\" + String.join(System.lineSeparator(), checkLines));\n            fail(\"Different number of lines, expected \" + etalonLines.length + \" but read \" +\n                checkLines.length + \" : \" + checkFile.getAbsolutePath());\n          }\n          for (int j = 0; j < etalonLines.length; j++) {\n            final String etalon = etalonLines[j];\n            final String check = checkLines[j];\n            if (!etalon.equals(check)) {\n              fail(\"Difference at line \" + (j + 1) + \": etalon='\" + etalon + \"', check='\" + check +\n                  '\\'');\n            }\n          }\n        } else {\n          final long checksumEtalon = FileUtils.checksumCRC32(etalonFile);\n          final long checksumTested = FileUtils.checksumCRC32(checkFile);\n          if (checksumEtalon != checksumTested) {\n            fail(\"Wrong checksum, etalon file = \" + etalonFile.getAbsolutePath() +\n                \"  , check file \" + checkFile.getAbsolutePath());\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Allows to tune preprocessor context.\n   *\n   * @param context preprocessor context\n   */\n  protected void tuneContext(final PreprocessorContext context) {\n\n  }\n\n  protected void tuneDefaultContextOptions(final PreprocessorContext context) {\n    context.setClearTarget(true);\n    context.setSources(Collections.singletonList(this.sourceFolder.getAbsolutePath()));\n    context.setTarget(tmpResultFolder.getRoot());\n    context.setExcludeExtensions(Collections.singletonList(\"xml\"));\n    context.setVerbose(true);\n  }\n\n  protected boolean isIgnoreEolInCheck() {\n    return true;\n  }\n\n  protected PreprocessorContext createPreprocessorContext(final File baseFolder) {\n    return new PreprocessorContext(baseFolder);\n  }\n\n  @Test\n  public final void executeTest() throws Exception {\n    final PreprocessorContext context =\n        createPreprocessorContext(new File(\"some_impossible_folder_121212\"));\n    this.tuneDefaultContextOptions(context);\n    this.tuneContext(context);\n    System.setProperty(\"jcp.line.separator\", \"\\n\");\n\n    final JcpPreprocessor preprocessor = new JcpPreprocessor(context);\n    final JcpPreprocessor.Statistics preprocessorStatistics = preprocessor.execute();\n\n    this.assertFolder(this.etalonFolder, this.tmpResultFolder.getRoot(), this.isIgnoreEolInCheck());\n    this.check(context, preprocessorStatistics);\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/BinFileTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.Collections;\n\npublic class BinFileTest extends AbstractUseCaseTest {\n\n  @Override\n  protected void tuneContext(final PreprocessorContext context) {\n    context.setExcludeExtensions(Collections.singletonList(\"bin\"));\n  }\n\n  @Override\n  public void check(final PreprocessorContext context, final JcpPreprocessor.Statistics stat)\n      throws Exception {\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(0, stat.getCopied());\n    assertEquals(2, context.findAllInputFiles().size());\n    assertEquals(1, context.findAllProducedFiles().size());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/DefUndefTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class DefUndefTest extends AbstractUseCaseTest {\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/EvalFileTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class EvalFileTest extends AbstractUseCaseTest {\n\n  @Override\n  protected void tuneContext(PreprocessorContext context) {\n    context.setCareForLastEol(true);\n  }\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(0, stat.getCopied());\n    assertEquals(3, context.findAllInputFiles().size());\n    assertEquals(2, context.findAllProducedFiles().size());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/ExternalGlobalDefFileTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.io.File;\n\npublic class ExternalGlobalDefFileTest extends AbstractUseCaseTest {\n\n  @Override\n  protected void tuneContext(PreprocessorContext context) {\n    context.registerConfigFile(new File(sourceFolder.getParent(), \"list.cfg\"));\n  }\n\n  @Override\n  public void check(final PreprocessorContext context, final JcpPreprocessor.Statistics stat)\n      throws Exception {\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(2, context.findAllInputFiles().size());\n    assertEquals(1, context.findAllProducedFiles().size());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/GenerationTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class GenerationTest extends AbstractUseCaseTest {\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(1, context.findAllInputFiles().size());\n    assertEquals(3, context.findAllProducedFiles().size());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/IncludeAndExitTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class IncludeAndExitTest extends AbstractUseCaseTest {\n\n  @Override\n  public void check(final PreprocessorContext context, final JcpPreprocessor.Statistics stat)\n      throws Exception {\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(3, context.findAllInputFiles().size());\n    assertEquals(1, context.findAllProducedFiles().size());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/InsidePreprocessingTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class InsidePreprocessingTest extends AbstractUseCaseTest {\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(2, context.findAllInputFiles().size());\n    assertEquals(1, context.findAllProducedFiles().size());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/PrefixPostfixTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class PrefixPostfixTest extends AbstractUseCaseTest {\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/PreserveIndentOffTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class PreserveIndentOffTest extends AbstractUseCaseTest {\n\n  @Override\n  protected void tuneContext(final PreprocessorContext context) {\n    context.setAllowWhitespaces(true);\n    assertFalse(context.isPreserveIndents());\n  }\n\n  @Override\n  public void check(final PreprocessorContext context, final JcpPreprocessor.Statistics stat)\n      throws Exception {\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(0, stat.getCopied());\n  }\n\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/PreserveIndentOnTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class PreserveIndentOnTest extends AbstractUseCaseTest {\n\n  @Override\n  protected void tuneContext(final PreprocessorContext context) {\n    context.setAllowWhitespaces(true);\n    context.setPreserveIndents(true);\n  }\n\n  @Override\n  public void check(final PreprocessorContext context, final JcpPreprocessor.Statistics stat)\n      throws Exception {\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(0, stat.getCopied());\n  }\n\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/SimpleTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class SimpleTest extends AbstractUseCaseTest {\n\n  @Override\n  public void check(final PreprocessorContext context, final JcpPreprocessor.Statistics stat)\n      throws Exception {\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(0, stat.getCopied());\n  }\n\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/SpacesBeforeDirectivesNotAllowedTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.io.File;\nimport java.util.List;\nimport java.util.concurrent.CopyOnWriteArrayList;\n\npublic class SpacesBeforeDirectivesNotAllowedTest extends AbstractUseCaseTest {\n\n  @Override\n  protected PreprocessorContext createPreprocessorContext(final File baseFolder) {\n    return new WarnLogPreprocessorContext(baseFolder);\n  }\n\n  @Override\n  protected void tuneContext(final PreprocessorContext context) {\n    context.setAllowWhitespaces(false);\n  }\n\n  @Override\n  public void check(final PreprocessorContext context, final JcpPreprocessor.Statistics stat)\n      throws Exception {\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(0, stat.getCopied());\n\n    final WarnLogPreprocessorContext warnContext = (WarnLogPreprocessorContext) context;\n\n    assertEquals(3, warnContext.getWarnings().stream()\n        .filter(x -> x != null && x.startsWith(FileInfoContainer.WARNING_SPACE_BEFORE_HASH))\n        .count());\n  }\n\n  private static class WarnLogPreprocessorContext extends PreprocessorContext {\n    private final List<String> warnings = new CopyOnWriteArrayList<>();\n\n    public WarnLogPreprocessorContext(final File baseDir) {\n      super(baseDir);\n    }\n\n\n    public List<String> getWarnings() {\n      return this.warnings;\n    }\n\n    @Override\n    public void logWarning(String text) {\n      this.warnings.add(text);\n      super.logWarning(text);\n    }\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/SpacesBeforeDirectivesTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.containers.FileInfoContainer;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.io.File;\nimport java.util.List;\nimport java.util.concurrent.CopyOnWriteArrayList;\n\npublic class SpacesBeforeDirectivesTest extends AbstractUseCaseTest {\n\n  @Override\n  protected PreprocessorContext createPreprocessorContext(final File baseFolder) {\n    return new WarnLogPreprocessorContext(baseFolder);\n  }\n\n  @Override\n  protected void tuneContext(final PreprocessorContext context) {\n    context.setAllowWhitespaces(true);\n  }\n\n  @Override\n  public void check(final PreprocessorContext context, final JcpPreprocessor.Statistics stat)\n      throws Exception {\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(0, stat.getCopied());\n\n    final WarnLogPreprocessorContext warnContext = (WarnLogPreprocessorContext) context;\n\n    assertEquals(0, warnContext.getWarnings().stream()\n        .filter(x -> x != null && x.startsWith(FileInfoContainer.WARNING_SPACE_BEFORE_HASH))\n        .count());\n  }\n\n  private static class WarnLogPreprocessorContext extends PreprocessorContext {\n    private final List<String> warnings = new CopyOnWriteArrayList<>();\n\n    public WarnLogPreprocessorContext(final File baseDir) {\n      super(baseDir);\n    }\n\n    public List<String> getWarnings() {\n      return this.warnings;\n    }\n\n    @Override\n    public void logWarning(String text) {\n      this.warnings.add(text);\n      super.logWarning(text);\n    }\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/StaticSiteTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class StaticSiteTest extends AbstractUseCaseTest {\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(10, stat.getPreprocessed());\n    assertEquals(205, stat.getCopied());\n    assertEquals(227, context.findAllInputFiles().size());\n    assertEquals(342, context.findAllProducedFiles().size());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/Str2JavaTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class Str2JavaTest extends AbstractUseCaseTest {\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/StringDirectiveTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class StringDirectiveTest extends AbstractUseCaseTest {\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/TextBufferVariablesTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport java.util.Collections;\n\npublic class TextBufferVariablesTest extends AbstractUseCaseTest {\n\n  @Override\n  protected void tuneContext(final PreprocessorContext context) {\n    context.setExcludeExtensions(Collections.singletonList(\"bin\"));\n  }\n\n  @Override\n  public void check(final PreprocessorContext context, final JcpPreprocessor.Statistics stat)\n      throws Exception {\n    assertEquals(1, stat.getPreprocessed());\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, context.findAllInputFiles().size());\n    assertEquals(1, context.findAllProducedFiles().size());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/UnknownVarAsFalseTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class UnknownVarAsFalseTest extends AbstractUseCaseTest {\n\n  @Override\n  protected void tuneContext(final PreprocessorContext context) {\n    context.setUnknownVariableAsFalse(true);\n  }\n\n\n  @Override\n  public void check(final PreprocessorContext context, final JcpPreprocessor.Statistics stat)\n      throws Exception {\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/UsePrefixAsMultilineTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\n\npublic class UsePrefixAsMultilineTest extends AbstractUseCaseTest {\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/usecases/UserFunctionTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.usecases;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.fail;\n\nimport com.igormaznitsa.jcp.JcpPreprocessor;\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport java.util.List;\nimport java.util.Set;\n\npublic class UserFunctionTest extends AbstractUseCaseTest implements PreprocessorExtension {\n\n  int calledfunc;\n  int calledaction;\n\n  @Override\n  protected void tuneContext(PreprocessorContext context) {\n    context.addPreprocessorExtension(this);\n  }\n\n  @Override\n  public void check(PreprocessorContext context, JcpPreprocessor.Statistics stat) throws Exception {\n    assertEquals(\"User function must be called once\", 1, calledfunc);\n    assertEquals(\"User action must be called twice\", 2, calledaction);\n    assertEquals(0, stat.getCopied());\n    assertEquals(1, stat.getPreprocessed());\n  }\n\n  @Override\n  public boolean processAction(final PreprocessorContext context, final List<Value> parameters) {\n    calledaction++;\n    assertEquals(1000L, parameters.get(0).asLong().longValue());\n    assertEquals(\"hello\", parameters.get(1).asString());\n    assertEquals(123L, parameters.get(2).asLong().longValue());\n    return true;\n  }\n\n  @Override\n  public Value processUserFunction(final PreprocessorContext preprocessorContext,\n                                   final String functionName, final List<Value> arguments) {\n    if (\"testfunc\".equals(functionName) && arguments.size() == 3) {\n      calledfunc++;\n      assertEquals(1L, arguments.get(0).asLong().longValue());\n      assertEquals(\"hry\", arguments.get(1).asString());\n      assertEquals(3L, arguments.get(2).asLong().longValue());\n      return Value.valueOf(\"yayaya\");\n    } else {\n      fail(\"Unexpected function '\" + functionName + '\\'');\n      throw new RuntimeException(\"Error\");\n    }\n  }\n\n  @Override\n  public boolean hasAction(int arity) {\n    return arity == 3;\n  }\n\n  @Override\n  public boolean hasUserFunction(String name, Set<Integer> arity) {\n    if (\"testfunc\".equals(name)) {\n      return arity.isEmpty() || arity.contains(3);\n    }\n    return false;\n  }\n\n  @Override\n  public Set<Integer> getUserFunctionArity(final String functionName) {\n    return \"testfunc\".equals(functionName) ? Set.of(3) : Set.of(-1);\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/utils/PreprocessorUtilsTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.utils;\n\nimport static org.junit.Assert.assertArrayEquals;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.InputStreamReader;\nimport java.lang.reflect.Field;\nimport java.nio.charset.Charset;\nimport org.junit.Test;\n\npublic class PreprocessorUtilsTest {\n\n  @Test\n  public void testReplaceStringPrefix() throws Exception {\n    final String[] testData = new String[] {\"--ae:123\", \"-homa-\", \"-hbd\", \"---Some\", \"-\", \"--\"};\n    final String[] processed =\n        PreprocessorUtils.replaceStringPrefix(new String[] {\"-\", \"--\"}, \"/\", testData);\n    assertArrayEquals(new String[] {\"/ae:123\", \"/homa-\", \"/hbd\", \"/-Some\", \"/\", \"/\"}, processed);\n  }\n\n  @Test\n  public void testGenerateStringForChar() throws Exception {\n    assertEquals(\"\", PreprocessorUtils.generateStringForChar(' ', -1));\n    assertEquals(\"\", PreprocessorUtils.generateStringForChar(' ', 0));\n    assertEquals(\" \", PreprocessorUtils.generateStringForChar(' ', 1));\n    assertEquals(\"aaa\", PreprocessorUtils.generateStringForChar('a', 3));\n  }\n\n  @Test\n  public void testReplacePartByChar() throws Exception {\n    assertEquals(\"\", PreprocessorUtils.replacePartByChar(\"\", ' ', 33, 44));\n    assertEquals(\"a  de\", PreprocessorUtils.replacePartByChar(\"abcde\", ' ', 1, 2));\n    assertEquals(\"a    \", PreprocessorUtils.replacePartByChar(\"abcde\", ' ', 1, 8));\n    assertEquals(\"abc  \", PreprocessorUtils.replacePartByChar(\"abcde\", ' ', 3, 8));\n  }\n\n  @Test\n  public void testMakeFileReader_charsetAndBufferSizeChange() throws Exception {\n    final Charset defaultCharset = Charset.defaultCharset();\n    final File testFile = new File(PreprocessorUtilsTest.class.getResource(\"somefile.txt\").toURI());\n\n    Charset nonDefaultCharset = null;\n    for (final Charset ch : Charset.availableCharsets().values()) {\n      if (!defaultCharset.equals(ch)) {\n        nonDefaultCharset = ch;\n        break;\n      }\n    }\n\n    assertNotNull(\n        \"We must have found a non default charset, system must have more than one available charset\",\n        nonDefaultCharset);\n\n    // some hack to get access to the wrapped reader\n    final Field inField = BufferedReader.class.getDeclaredField(\"in\");\n    inField.setAccessible(true);\n    final Field cbField = BufferedReader.class.getDeclaredField(\"cb\");\n    cbField.setAccessible(true);\n\n    final int BUFFER_SIZE = 0xCAFE;\n\n    final BufferedReader reader =\n        PreprocessorUtils.makeFileReader(testFile, nonDefaultCharset, BUFFER_SIZE);\n\n    // check that we have selected the non standard charset\n    final InputStreamReader wrappedReader = (InputStreamReader) inField.get(reader);\n    assertNotNull(\"Must not be null\", wrappedReader);\n    assertEquals(\"The non default charset must be set\", nonDefaultCharset.name(),\n        wrappedReader.getEncoding());\n\n    // check that we have changed the buffer size\n    final char[] insideCharBuffer = (char[]) cbField.get(reader);\n    assertNotNull(\"Must not be null\", insideCharBuffer);\n    assertEquals(\"Must have our selected size\", BUFFER_SIZE, insideCharBuffer.length);\n\n  }\n}\n"
  },
  {
    "path": "jcp/src/test/java/com/igormaznitsa/jcp/utils/antpathmatcher/AntPathMatcherTest.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.utils.antpathmatcher;\n\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport com.igormaznitsa.jcp.utils.AntPathMatcher;\nimport org.junit.Test;\n\npublic class AntPathMatcherTest {\n\n  @Test\n  public void testMatching() {\n    final AntPathMatcher matcher = new AntPathMatcher();\n\n    assertTrue(matcher.match(\"\", \"\"));\n    assertFalse(matcher.match(\"\", \"a\"));\n    assertFalse(matcher.match(\"a\", \"\"));\n    assertTrue(matcher.match(\"?\", \"a\"));\n    assertFalse(matcher.match(\"*\", \"\"));\n    assertFalse(matcher.match(\"?\", \"\"));\n\n    assertTrue(matcher.match(\"**/test\", \"test\"));\n    assertTrue(matcher.match(\"**/test?\", \"test1\"));\n    assertTrue(matcher.match(\"**/test*\", \"test111\"));\n    assertTrue(matcher.match(\"**/test\", \"some/test\"));\n    assertTrue(matcher.match(\"**/test\", \"some/help/test\"));\n    assertTrue(matcher.match(\"some/**/test\", \"some/help/test\"));\n    assertTrue(matcher.match(\"**/some/help/test\", \"some/help/test\"));\n    assertTrue(matcher.match(\"/**/help/test\", \"/some/help/test\"));\n    assertTrue(matcher.match(\"**/help/test\", \"some/help/test\"));\n    assertTrue(matcher.match(\"**\\\\help\\\\test\", \"some\\\\help\\\\test\"));\n\n    assertFalse(matcher.match(\"**\\\\help\\\\test\", \"some\\\\help\\\\test1\"));\n    assertFalse(matcher.match(\"some\", \"some1\"));\n    assertFalse(matcher.match(\"some/help\", \"some/help/ddd\"));\n  }\n\n}\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/cmdline/global_variable_def.txt",
    "content": "#some comment\ntest=\"hello world\"\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/context/spacedFile.txt",
    "content": "//      #local VAR=\"hello\"\n//     $ /*$VAR$*/\n//  $$ /*$VAR$*/ Universe\nsome test/* - */must be removed"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/context/standardFile.txt",
    "content": "//#local VAR=\"hello\"\n//$ /*$VAR$*/\n//$$ /*$VAR$*/ Universe\nsome test/*-*/must be removed"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_abort.txt",
    "content": "1\n2\n3\n4\n//#abort\n5\n6\n---START_ETALON---\n1\n2\n3\n4\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_action.txt",
    "content": "test\n//#action 1,2,3+4,5+6,true,\"hello,\"   \nend\n//#if false   \n//#action unexpected     \n//#endif\n---START_ETALON---\ntest\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_comment_next_line.txt",
    "content": "begin\n//#//\n     hello\n//#//\n\ntest\n---START_ETALON---\nbegin\n//     hello\n//\ntest"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_define.txt",
    "content": "test\n//#define somevar\n//#define somenum 3*8\n/*$somevar$*/ /*$somenum$*/\nend\n---START_ETALON---\ntest\ntrue 24\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_definel.txt",
    "content": "test\n//#definel somevar // test\n//#definel somenum 3*8\n/*$somevar$*/ /*$somenum$*/\nend\n---START_ETALON---\ntest\ntrue 24\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_echo.txt",
    "content": "start\n//#local test=1\n//#echo string /*$test+1$*/ ok\nend\n---START_ETALON---\nstart\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_error.txt",
    "content": "start\n//#local test=1\n//#error \"string\"+(test+1)\nend\n---START_ETALON---\nstart\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_excludeif.txt",
    "content": "some text\n   test\n//#excludeif true\n//#_if false\n//#excludeif false\n//#_endif\n//#excludeif hello+world\ntest"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_exit.txt",
    "content": "test\n//#exit\nunexpected\n---START_ETALON---\ntest"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_exitif.txt",
    "content": "test\n//#exitif false\nexpected\n//#exitif true\nunexpected\n---START_ETALON---\ntest\nexpected"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_global.txt",
    "content": "//#global xxx=10\nttt\n---START_ETALON---\nttt"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_globalifelseendif.txt",
    "content": "//#_if true\n    //#if true\nhello\n    //#else\nworld\n    //#endif\n    //#global expected=true\n//#_else\n    //#_if true\n        //#global expected=false\n    //#_else\n        //#global expected=false\n    //#_endif\n    //#global unexpected=false\n    //#if false\nunexp\n    //#else\nexp\n    //#endif\n//#_endif\ntest\n---START_ETALON---\nhello\nexp\ntest"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_globalifelseendif2.txt",
    "content": "//#if true\na\n    //#_if 0219384092384091\nb\n    //#_if true\n//#else\nc\n    //#_endif\nd\n    //#_else\n//#endif\n---START_ETALON---\na\nb"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_if_else_endif.txt",
    "content": "hello\n//#if false\n//#local test = 111\n// some comment1\nnonprocessed /*$test$*/\n//#endif\n//#local x=true\n//#local y=false\n//#local z=false\n//#if x\n// some comment2\n    //#if y\nunexpected1\n    //#else\n        //#if z\nunexpected2\n        //#else\n            //#if !z\nexpected\n            //#endif\n        //#endif\n    //#endif\n//#else\n    //#if y\nmust not be out\n    //#else\nunexpected3\n    //#endif\n//#endif\nworld\n---START_ETALON---\nhello\n// some comment2\nexpected\nworld"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_if_else_endif_with_keptlines.txt",
    "content": "hello\n//#if false\n//#local test = 111\nnonprocessed /*$test$*/\n//#endif\n//#local x=true\n//#local y=false\n//#local z=false\n//#if x\n    //#if y\nunexpected1\n    //#else\n        //#if z\nunexpected2\n        //#else\n            //#if !z\nexpected\n            //#endif\n        //#endif\n    //#endif\n//#else\n    //#if y\nmust not be out\n    //#else\nunexpected3\n    //#endif\n//#endif\nworld\n---START_ETALON---\nhello\n//JCP! if false\n//JCP! local test = 111\n//JCP> nonprocessed /*$test$*/\n//JCP! endif\n//JCP! local x=true\n//JCP! local y=false\n//JCP! local z=false\n//JCP! if x\n    //JCP! if y\n//JCP> unexpected1\n    //JCP! else\n        //JCP! if z\n//JCP> unexpected2\n        //JCP! else\n            //JCP! if !z\nexpected\n            //JCP! endif\n        //JCP! endif\n    //JCP! endif\n//JCP! else\n    //JCP! if y\n//JCP> must not be out\n    //JCP! else\n//JCP> unexpected3\n    //JCP! endif\n//JCP! endif\nworld"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_ifdef.txt",
    "content": "start\n//#ifdef test\nunexpected\n//#else\nexpected1\n//#endif\n//#define test\n//#if true\n    //#ifdef test\nexpected2\n    //#else\nunexpected\n    //#endif\n//#endif\n//#ifdef BYTECODE\nsomebytecode\n//#endif\nend\n---START_ETALON---\nstart\nexpected1\nexpected2\nsomebytecode\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_ifdefined.txt",
    "content": "start\n//#ifdefined test\nunexpected\n//#else\nexpected1\n//#endif\n//#define test\n//#if true\n    //#ifdefined test\nexpected2\n    //#else\nunexpected\n    //#endif\n//#endif\n//#ifdefined BYTECODE\nsomebytecode\n//#endif\nend\n---START_ETALON---\nstart\nexpected1\nexpected2\nsomebytecode\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_ifndef.txt",
    "content": "start\n//#ifndef test\nexpected1\n//#else\nunexpected\n//#endif\n//#define test\n//#if true\n    //#ifndef test\nunexpected\n    //#else\nexpected2\n    //#endif\n//#endif\n//#ifndef BYTECODE\nsomebytecode\n//#endif\nend\n---START_ETALON---\nstart\nexpected1\nexpected2\nsomebytecode\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_include.txt",
    "content": "start\n//#include \"./directive_include2.txt\"\n//#include __filefolder__+\"/directive_include3.txt\"\nend\n---START_ETALON---\nstart\nThis text must be included\nand this one too\nAbsolute path\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_include2.txt",
    "content": "This text must be included\nand this one too"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_include3.txt",
    "content": "Absolute path"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_local.txt",
    "content": "//#local l_stringGamesNumber = \"\"\n  \t//#local l_menuID = \"hello\"    \n\t//#local l_menuName = \"menu\"    \n/*$l_menuID+l_menuName+l_stringGamesNumber$*/\n//#if false\n//#local x  =1\n//#endif\n    hello\n                //#local x = 5\nworld\n           //#local y= 10\nand me\n//#local z=x+y\n//#local test.var = z+\".\"+x+\".\"+y\n/*$test.var$*/\n---START_ETALON---\nhellomenu\n    hello\nworld\nand me\n15.5.10\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_msg.txt",
    "content": "start\n//#local test=1\n//#msg   string /*$test+1$*/ ok  \n//#msg string /*$6*8$*/ ok\nend\n---START_ETALON---\nstart\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_outdir.txt",
    "content": "//#local path=\"a/\"\n//#outdir path+\"expected\"\n//#if false\n//#outdir path+\"unexpected\"\n//#endif\n/*$jcp.dst.dir$*/\nok\n---START_ETALON---\na/expected\nok"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_outdisabled.txt",
    "content": "hello world\n//#-\n//#if true\nunexpected text\n//#endif\n---START_ETALON---\nhello world"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_outenabled.txt",
    "content": "hello world\n//#-\nunexpected text\n//#+\nexpected text\n---START_ETALON---\nhello world\nexpected text"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_outname.txt",
    "content": "//#outname \"expected.java\"\n//#if false\n//#outname \"unexpected.html\"\n//#endif\n/*$jcp.dst.name$*/\nok\n---START_ETALON---\nexpected.java\nok"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_prefixpostfix.txt",
    "content": "//#postfix+\nThis string must be in the postfix\n//#postfix-\nThis string must be in the normal (1)\n//#prefix+\nThis string must be in the prefix\n//#prefix-\nThis string must be in the normal (2)\n//#if false\n//#postfix+\n//#endif\nThis string must be in the normal (3)\n//#if false\n//#prefix+\n//#endif\nThis string must be in the normal (4)\nok\n---START_ETALON---\nThis string must be in the prefix\nThis string must be in the normal (1)\nThis string must be in the normal (2)\nThis string must be in the normal (3)\nThis string must be in the normal (4)\nok\nThis string must be in the postfix\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_special.txt",
    "content": "//$hello /*$111+112$*/ world\n//$$hello /*$111+112$*/ world\n//$\"\"\"hello /*$111+112$*/ world\n//$$\"\"\"hello /*$111+112$*/ world\nhello/*-*/world\n---START_ETALON---\nhello 223 world\nhello /*$111+112$*/ world\n\"\"\"hello 223 world\n\"\"\"hello /*$111+112$*/ world\nhello"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_special_block.txt",
    "content": "//$\"\"\"hello /*$111+112$*/ world\n//$\"\"\"next\n\n//$$\"\"\"hello /*$111+112$*/ world\n//$$\"\"\"next/*$111+112$*/\n\n//$$\"\"\"hello /*$111+112$*/ world\n//$\"\"\"middle\n//$$\"\"\"next/*$111+112$*/\n\n//$$\"\"\"hello /*$111+112$*/ world\n//$split\n//$$\"\"\"next/*$111+112$*/\n\n//$\"\"\"hello /*$111+112$*/ world\n//$$split\n//$\"\"\"next/*$111+112$*/\n\n//$\"\"\"line1\n//#local a=\"\"\n//$\"\"\"line2\n\n   //$\"\"\"hello\n   //$\"\"\"world earth\n---START_ETALON---\n      hello 223 world\n      next\n\n       hello /*$111+112$*/ world\n       next/*$111+112$*/\n\n       hello /*$111+112$*/ world\n      middle\n       next/*$111+112$*/\n\n       hello /*$111+112$*/ world\n   split\n       next/*$111+112$*/\n\n      hello 223 world\n    split\n      next223\n\n      line1\n      line2\n\n         hello\n         world earth\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_undef.txt",
    "content": "test\n//#definel localone\n/*$somevar$*/ /*$localone$*/\n//#undef somevar\n//#undef localone\nend\n---START_ETALON---\ntest\ntrue true\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_warning.txt",
    "content": "start\n//#local test=1\n//#warning \"string\"+(test+1)\nend\n---START_ETALON---\nstart\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/directive_while_continue_break_end.txt",
    "content": "begin\n//#local counter = 3\n//#while counter>0\n    //#if counter == 2\n        //#local counter = counter-1\n        //#continue\n    //#endif\n    //#local counter2 = 3\n    //#while counter2>0\n        //#if counter2==1\n            //#break\n        //#endif\n/*$counter$*/ /*$counter2$*/\n        //#local counter2=counter2-1\n    //#end\n    //#local counter=counter-1\n//#end\nend\n//#local c=4\n//#while c>=0\n    //#local c=c-1\n    //#if c==1\nbreak detected\n        //#break\n    //#else\n/*$c$*/\n    //#endif\n//#end\n//#if false\n    //#while true\n000\n        //#continue\n        //#break\n222\n        //#local unknown = unknown\n        //#break\n111\n        //#while false\n            //#if true\n333\n            //#endif\n            //#continue\n444\n        //#end\n    //#end\n//#endif\nendall\n---START_ETALON---\nbegin\n3 3\n3 2\n1 3\n1 2\nend\n3\n2\nbreak detected\nendall"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/only_spaces.txt",
    "content": "                                          \n             \n                                               \n                          \n          \n                                                  \n             \n    \n---START_ETALON---\n                                          \n             \n                                               \n                          \n          \n                                                  \n             \n    "
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/directives/specvars_ro.txt",
    "content": "start\n//#outname \"hello_world.jpg\"\nline /*$__LINE__$*/\nline /*$__LINE__$*/\nline /*$__LINE__$*/\nline /*$__LINE__$*/\nline /*$__LINE__$*/\nfilesrc /*$__FILENAME__$*/\nfilesrc /*$jcp.src.name$*/\nfiledst /*$jcp.dst.name$*/\nend\n---START_ETALON---\nstart\nline 3\nline 4\nline 5\nline 6\nline 7\nfilesrc specvars_ro.txt\nfilesrc specvars_ro.txt\nfiledst hello_world.jpg\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/exceptions/wrong_bracket.txt",
    "content": "//#local test=10\n\n//#while test>0\n\n    //#local test=test-1\n\n\n//#end\n\n//#if false\n//#local hello = (1+2)/45*334)\n\n\n//#endif\n\n\n//#local hello = (\n\n\ntest"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/exceptions/wrong_bracket_closing.txt",
    "content": "//#local test=10\n\n//#while test>0\n\n    //#local test=test-1\n\n\n//#end\n\n//#if false\n//#local hello = (1+2)/45*334)\n\n\n//#endif\n\n\n//#local hello = xml_open(\"some.xml\"))\n\n\ntest"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/exceptions/wrong_bracket_include.txt",
    "content": "ufasd\nf\ndsasa\ndsa\nd\nsa\n d\nsa\nd sadli apodei qei pwqdsa\nd\nsad\ns\nad\nsad sad\n\n\ns\nad\nas d\nsad\n sad\nas d\n\n\n\n//#include \"./wrong_bracket.txt\"\nijfda\n asd\ndasd\nas dsad "
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/expression/functions/eval/TestBin.txt",
    "content": "Hello Preprocessor!"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/expression/functions/eval/TestBinLong.txt",
    "content": "какие то русские буквы\nHello Preprocessor! it is very very very long line to fill the file! sometime it is useful for tests!\nals I decided to add one more line."
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/expression/functions/eval/TestEval.java",
    "content": "//#-\npackage com.igormaznitsa.jcp;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.exceptions.PreprocessorException;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.utils.PreprocessorUtils;\nimport java.io.*;\nimport static org.junit.Assert.*;\nimport org.junit.Test;\n//#+\n//#ifdefined includemeth\npublic final class TestEval {\n  public void main(String ... args){\n//#endif\n    System.out.println(\"/*$hello_world$*/\");\n//#ifdefined includemeth\n  }\n}\n//#endif\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/expression/functions/eval/TestEvalWithIncluded.java",
    "content": "//#-\npublic final class TestEvalWithIncluded {\n  public void main(String ... args){\n//#+\n/*$evalfile(\"./TestEval.java\")+__filename__$*/\n//#-\n  }\n}\n//#+\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/expression/functions/xml/noxml.txt",
    "content": "adslkj ql;d\nsd\nsad\n sadsa d\nas\n\nwqe\nsd\nsad\nsad"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/expression/functions/xml/test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<root attr=\"hello\">\n<element attr=\"first\">elem1</element>\n<element>elem2</element>\n<element>elem3</element>\n<element><![CDATA[<test>]]></element>\n<languages>\n  <language short=\"rus\" long=\"russian\">rustext</language>\n  <language short=\"ger\" long=\"german\">gertext</language>\n  <language short=\"est\" long=\"estonian\">esttext</language>\n  <language short=\"fin\" long=\"finnish\">fintext</language>\n  <language short=\"fr\" long=\"french\">frtext</language>\n  <language short=\"it\" long=\"italian\">ittext</language>\n</languages>\n</root>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/global_error_at.txt",
    "content": "# error at the string 8\n\n\n\n\n\n\n@yyejjw.txt\nvar=\"h\""
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/global_ok.txt",
    "content": "# this is a comment\n#@\n    #@@@@@\n#@@@\n\n\n\n\n\n\n/T:ISO-8859-1\n\n    globalVar1=\"hello world\"\n#tttest\n\nglobalVar2=1*2+1\n\n\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/maven/test.pom.xml",
    "content": "\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>JCPreprocessor-test</artifactId>\n    <version>1.0-SNAPSHOT</version>\n    <packaging>jar</packaging>\n\n    <name>Test of Preprocessor Mojo</name>\n    <description>The pom is used for test purposes</description>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>com.igormaznitsa</groupId>\n                <artifactId>jcp</artifactId>\n                <version>7.3.0</version>\n                <goals>\n                    <goal>preprocess</goal>\n                </goals>\n                <configuration>\n                    <sources>\n                        <folder>/</folder>\n                        <folder>/some</folder>\n                        <folder>/another/some</folder>\n                    </sources>\n                    <keepAttributes>true</keepAttributes>\n                    <target>destination_dir</target>\n                    <excludeExtensions>\n                        <extension>xml</extension>\n                        <extension>html</extension>\n                    </excludeExtensions>\n                    <extensions>\n                        <ext>java</ext>\n                        <ext>txt</ext>\n                    </extensions>\n                    <sourceEncoding>UTF-16</sourceEncoding>\n                    <targetEncoding>US-ASCII</targetEncoding>\n                    <replaceSources>true</replaceSources>\n                    <keepComments>true</keepComments>\n                    <dryRun>true</dryRun>\n                    <verbose>true</verbose>\n                    <dontOverwriteSameContent>true</dontOverwriteSameContent>\n                    <clearTarget>true</clearTarget>\n                    <keepLines>true</keepLines>\n                    <careForLastEol>true</careForLastEol>\n                    <allowWhitespaces>true</allowWhitespaces>\n                    <preserveIndents>true</preserveIndents>\n                    <unknownVarAsFalse>true</unknownVarAsFalse>>\n                    <excludeFolders>\n                      <folder>.git</folder>\n                      <folder>.hg</folder>\n                      <folder>**/.cvs</folder>\n                      <folder>c:\\hello\\**\\world</folder>\n                    </excludeFolders>\n                    <configFiles>\n                        <file>test1.cfg</file>\n                        <file>test2.cfg</file>\n                    </configFiles>\n                    <vars>\n                        <globalvar1>3</globalvar1>\n                        <globalvar2>hello world</globalvar2>\n                    </vars>\n                </configuration>\n            </plugin>\n        </plugins>\n            \n    </build>    \n\n</project>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/removers/java/etalon.etl",
    "content": "\npublic class test {\n    \n    public static void main(String ... args) {\n        \n\tfor(String a : args) {\n\t  \n\t  System.out.println(\"Arg: \"+a);\n\t}\n        \n        System.out.println(\"//Hello /*World*/\"); \n        int a = 5+10;\n        System.out.println(\"What a terrible comments/**aaaaa*/\");\n        \n    }\n}\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/removers/java/test_java.ppp",
    "content": "//#outname \"w_o_comments.ttt\"\n/**\n * Test file to check the remove comment preprocessor feature\n * ////////////////////////////////////////////////\n * @author Igor Maznitsa (igor.maznitsa@igormaznitsa.com)\n */\npublic class test {\n    /*\n        Some test method\n    */\n    public static void main(String ... args) {\n        // print each argument\n\tfor(String a : args) {\n\t  // to console\n\t  System.out.println(\"Arg: \"+a);\n\t}\n        // ok, the loop is completed\n        System.out.println(\"//Hello /*World*/\"); // It's some test commented call\n        /*It's a*/int a = /*It's the first arg*/5+/*It's the second one*/10;//Ha ha ha ha ha ha ha ha\n        System.out.println(\"What a terrible comments/**aaaaa*/\");// test\n        /*\n            float pi = 3.14f; // it's the most secret part of code, remove it after reading\n        */\n    }\n}"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/AbortTest/etl/text.txt",
    "content": "1\n3\n5\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/AbortTest/src/text.txt",
    "content": "//#if false\n//#abort unexpected\n//#endif\n//#include \"text1.txt\"\nend\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/AbortTest/src/text1.txt",
    "content": "//#excludeif true\n1\n//#include \"text2.txt\"\n2\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/AbortTest/src/text2.txt",
    "content": "//#excludeif true\n3\n//#include \"text3.txt\"\n4\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/AbortTest/src/text3.txt",
    "content": "//#excludeif true\n5\n//#abort expected\n6\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/BinFileTest/etl/body.txt",
    "content": "BASE64\niVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEpJREFUeNpi9K1d/Z+BTLCpKYSRBcTY3Bxqgk0B0PAz+ORANAuUfxaPRfjkGJgYKATDwADG0WgcjUZgNDICaWNyDfj///9ZgAADAHNfI01qaFVqAAAAAElFTkSuQmCC\n\nBASE64 splitted to lines\niVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFn\nZVJlYWR5ccllPAAAAEpJREFUeNpi9K1d/Z+BTLCpKYSRBcTY3Bxqgk0B0PAz+ORANAuUfxaPRfjkGJgY\nKATDwADG0WgcjUZgNDICaWNyDfj///9ZgAADAHNfI01qaFVqAAAAAElFTkSuQmCC\n\nBYTE[]\n(byte)0x89,(byte)0x50,(byte)0x4E,(byte)0x47,(byte)0xD,(byte)0xA,(byte)0x1A,(byte)0xA,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0xD,(byte)0x49,(byte)0x48,(byte)0x44,(byte)0x52,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x10,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x10,(byte)0x8,(byte)0x6,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x1F,(byte)0xF3,(byte)0xFF,(byte)0x61,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x19,(byte)0x74,(byte)0x45,(byte)0x58,(byte)0x74,(byte)0x53,(byte)0x6F,(byte)0x66,(byte)0x74,(byte)0x77,(byte)0x61,(byte)0x72,(byte)0x65,(byte)0x0,(byte)0x41,(byte)0x64,(byte)0x6F,(byte)0x62,(byte)0x65,(byte)0x20,(byte)0x49,(byte)0x6D,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x52,(byte)0x65,(byte)0x61,(byte)0x64,(byte)0x79,(byte)0x71,(byte)0xC9,(byte)0x65,(byte)0x3C,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x4A,(byte)0x49,(byte)0x44,(byte)0x41,(byte)0x54,(byte)0x78,(byte)0xDA,(byte)0x62,(byte)0xF4,(byte)0xAD,(byte)0x5D,(byte)0xFD,(byte)0x9F,(byte)0x81,(byte)0x4C,(byte)0xB0,(byte)0xA9,(byte)0x29,(byte)0x84,(byte)0x91,(byte)0x5,(byte)0xC4,(byte)0xD8,(byte)0xDC,(byte)0x1C,(byte)0x6A,(byte)0x82,(byte)0x4D,(byte)0x1,(byte)0xD0,(byte)0xF0,(byte)0x33,(byte)0xF8,(byte)0xE4,(byte)0x40,(byte)0x34,(byte)0xB,(byte)0x94,(byte)0x7F,(byte)0x16,(byte)0x8F,(byte)0x45,(byte)0xF8,(byte)0xE4,(byte)0x18,(byte)0x98,(byte)0x18,(byte)0x28,(byte)0x4,(byte)0xC3,(byte)0xC0,(byte)0x0,(byte)0xC6,(byte)0xD1,(byte)0x68,(byte)0x1C,(byte)0x8D,(byte)0x46,(byte)0x60,(byte)0x34,(byte)0x32,(byte)0x2,(byte)0x69,(byte)0x63,(byte)0x72,(byte)0xD,(byte)0xF8,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0x59,(byte)0x80,(byte)0x0,(byte)0x3,(byte)0x0,(byte)0x73,(byte)0x5F,(byte)0x23,(byte)0x4D,(byte)0x6A,(byte)0x68,(byte)0x55,(byte)0x6A,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x49,(byte)0x45,(byte)0x4E,(byte)0x44,(byte)0xAE,(byte)0x42,(byte)0x60,(byte)0x82\n\nBYTE[] splitted to lines\n(byte)0x89,(byte)0x50,(byte)0x4E,(byte)0x47,(byte)0xD,(byte)0xA,(byte)0x1A,(byte)0xA,\n(byte)0x0,(byte)0x0,(byte)0x0,(byte)0xD,(byte)0x49,(byte)0x48,(byte)0x44,(byte)0x52,\n(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x10,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x10,\n(byte)0x8,(byte)0x6,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x1F,(byte)0xF3,(byte)0xFF,\n(byte)0x61,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x19,(byte)0x74,(byte)0x45,(byte)0x58,\n(byte)0x74,(byte)0x53,(byte)0x6F,(byte)0x66,(byte)0x74,(byte)0x77,(byte)0x61,(byte)0x72,\n(byte)0x65,(byte)0x0,(byte)0x41,(byte)0x64,(byte)0x6F,(byte)0x62,(byte)0x65,(byte)0x20,\n(byte)0x49,(byte)0x6D,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x52,(byte)0x65,(byte)0x61,\n(byte)0x64,(byte)0x79,(byte)0x71,(byte)0xC9,(byte)0x65,(byte)0x3C,(byte)0x0,(byte)0x0,\n(byte)0x0,(byte)0x4A,(byte)0x49,(byte)0x44,(byte)0x41,(byte)0x54,(byte)0x78,(byte)0xDA,\n(byte)0x62,(byte)0xF4,(byte)0xAD,(byte)0x5D,(byte)0xFD,(byte)0x9F,(byte)0x81,(byte)0x4C,\n(byte)0xB0,(byte)0xA9,(byte)0x29,(byte)0x84,(byte)0x91,(byte)0x5,(byte)0xC4,(byte)0xD8,\n(byte)0xDC,(byte)0x1C,(byte)0x6A,(byte)0x82,(byte)0x4D,(byte)0x1,(byte)0xD0,(byte)0xF0,\n(byte)0x33,(byte)0xF8,(byte)0xE4,(byte)0x40,(byte)0x34,(byte)0xB,(byte)0x94,(byte)0x7F,\n(byte)0x16,(byte)0x8F,(byte)0x45,(byte)0xF8,(byte)0xE4,(byte)0x18,(byte)0x98,(byte)0x18,\n(byte)0x28,(byte)0x4,(byte)0xC3,(byte)0xC0,(byte)0x0,(byte)0xC6,(byte)0xD1,(byte)0x68,\n(byte)0x1C,(byte)0x8D,(byte)0x46,(byte)0x60,(byte)0x34,(byte)0x32,(byte)0x2,(byte)0x69,\n(byte)0x63,(byte)0x72,(byte)0xD,(byte)0xF8,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0x59,\n(byte)0x80,(byte)0x0,(byte)0x3,(byte)0x0,(byte)0x73,(byte)0x5F,(byte)0x23,(byte)0x4D,\n(byte)0x6A,(byte)0x68,(byte)0x55,(byte)0x6A,(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,\n(byte)0x49,(byte)0x45,(byte)0x4E,(byte)0x44,(byte)0xAE,(byte)0x42,(byte)0x60,(byte)0x82\n---\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/BinFileTest/src/body.txt",
    "content": "BASE64\n/*$binfile(\"./file.bin\",\"base64\")$*/\n\nBASE64 splitted to lines\n/*$binfile(\"./file.bin\",\"base64s\")$*/\n\nBYTE[]\n/*$binfile(\"./file.bin\",\"byte[]\")$*/\n\nBYTE[] splitted to lines\n/*$binfile(\"./file.bin\",\"byte[]s\")$*/\n---"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/DefUndefTest/etl/text.txt",
    "content": "expected1\nexpected2\nexpected3\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/DefUndefTest/src/text.txt",
    "content": "//#ifdef HELLO_WORLD\nunexpected1\n//#else\nexpected1\n//#endif\n//#define HELLO_WORLD \"hello world\"\n//#ifndef HELLO_WORLD\nunexpected2\n//#else\nexpected2\n//#endif\n//#undef HELLO_WORLD\n//#ifdef HELLO_WORLD\nunexpected3\n//#else\nexpected3\n//#endif"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/EvalFileTest/etl/newfolder/file1.txt",
    "content": "File One ODYN\nend\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/EvalFileTest/etl/newfolder/file2.txt",
    "content": "File Two DVA\nend\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/EvalFileTest/src/_file1.txt",
    "content": "//#excludeif TRUE\nFile One /*$SOME_TEXT$*/"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/EvalFileTest/src/_file2.txt",
    "content": "//#excludeif TRUE\nFile Two /*$SOME_TEXT$*/"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/EvalFileTest/src/text.txt",
    "content": "//#noautoflush\n//#outdir \"newfolder\"\n//#definel SOME_TEXT \"ODYN\"\n/*$evalfile(\"_file1.txt\")$*/\nend\n//#outname \"file1.txt\"\n//#flush\n//#definel SOME_TEXT \"DVA\"\n/*$evalfile(\"_file2.txt\")$*/\nend\n//#outname \"file2.txt\"\n//#flush"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/ExternalGlobalDefFileTest/etl/test.txt",
    "content": "hello world\nsee on Java Comment Preprocessor\nend\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/ExternalGlobalDefFileTest/list.cfg",
    "content": "var1=\"world\"\nvar2=\"Java \"+\"Comment \"+\"Preprocessor\"\n\n\n\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/ExternalGlobalDefFileTest/src/test.txt",
    "content": "hello /*$var1$*/\nsee on /*$var2$*/\nend"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/GenerationTest/etl/file1.ttt",
    "content": "file 1\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/GenerationTest/etl/file2.ttt",
    "content": "file 2\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/GenerationTest/etl/file3.ttt",
    "content": "file 3\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/GenerationTest/src/text.txt",
    "content": "//#noautoflush\n//#define COUNTER 1\n//#while COUNTER<=3\nfile /*$COUNTER$*/\n//#outname \"file\"+COUNTER+\".ttt\"\n//#define COUNTER COUNTER+1\n//#msg \"Counter is \"+COUNTER\n//#flush\n//#end"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/IncludeAndExitTest/etl/text.txt",
    "content": "start\n1\n2\n3\n4\n5\ntrue\nend\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/IncludeAndExitTest/src/text.txt",
    "content": "start\n//#include \"text1.txt\"\n//#definel HELLO\n//#include \"text2.txt\"\n//#if false\n//#exit\n//#else\nend\n//#endif\n//#exit\nunsuspected text\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/IncludeAndExitTest/src/text1.txt",
    "content": "//#excludeif true\n1\n2\n3\n//#exitif false\n4\n5\n//#exitif true\n6\n7"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/IncludeAndExitTest/src/text2.txt",
    "content": "//#excludeif true\n/*$HELLO$*/\n//#exit\nWorld"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/InsidePreprocessingTest/etl/text.txt",
    "content": "start\nthe prefix\nthe middle\nthe postfix\nend\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/InsidePreprocessingTest/src/some.txt",
    "content": "//#excludeif true\n//#postfix+\nthe postfix\n//#postfix-\n//#prefix+\nthe prefix\n//#prefix-\nthe middle\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/InsidePreprocessingTest/src/text.txt",
    "content": "start\n/*$evalfile(\"./some.txt\")$*/end"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/PrefixPostfixTest/etl/text.txt",
    "content": "the most first start\nstart\nmiddle\nmiddle2\nthe first line in postfix\nthe end\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/PrefixPostfixTest/src/text.txt",
    "content": "start\n//#postfix+\nthe first line in postfix\n//#postfix-\n//#-\nignored section\nat all\noh my god!\n//#+\n//#prefix+\nthe most first start\n//#prefix-\nmiddle\n//#postfix+\nthe end\n//#postfix-\nmiddle2"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/PreserveIndentOffTest/etl/text.txt",
    "content": " test var has HUZZAAA! value\n      test var has HUZZAAA! value\n   test var has /*$TEST_VAR$*/ value\n         test var has /*$TEST_VAR$*/ value\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/PreserveIndentOffTest/src/text.txt",
    "content": "//#local TEST_VAR=\"HUZZAAA!\"\n//$ test var has /*$TEST_VAR$*/ value\n  //  $    test var has /*$TEST_VAR$*/ value\n//$$   test var has /*$TEST_VAR$*/ value\n     //     $$    test var has /*$TEST_VAR$*/ value"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/PreserveIndentOnTest/etl/text.txt",
    "content": "    test var has HUZZAAA! value\n             test var has HUZZAAA! value\n       test var has /*$TEST_VAR$*/ value\n                       test var has /*$TEST_VAR$*/ value\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/PreserveIndentOnTest/src/text.txt",
    "content": "//#local TEST_VAR=\"HUZZAAA!\"\n//$ test var has /*$TEST_VAR$*/ value\n  //  $    test var has /*$TEST_VAR$*/ value\n//$$   test var has /*$TEST_VAR$*/ value\n     //     $$    test var has /*$TEST_VAR$*/ value"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/SimpleTest/etl/text.txt",
    "content": "1.Hello World at line 7\n2.Hello World at line 7\n3.Hello World at line 7\n4.Hello World at line 7\n5.Hello World at line 7\n6.Hello World at line 7\n7.Hello World at line 7\n8.Hello World at line 7\n9.Hello World at line 7\n10.Hello World at line 7\n\n\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/SimpleTest/src/text.txt",
    "content": "//#define MESSAGE \"Hello World\"\n//#define MSG_NUMBER 10\n//#define SHOW true\n//#if SHOW\n//#definel COUNTER 1\n//#while COUNTER<=MSG_NUMBER\n/*$COUNTER$*/./*$MESSAGE$*/ at line /*$__LINE__$*/\n//#definel COUNTER COUNTER+1\n//#end\n//#endif\n\n\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/SpacesBeforeDirectivesNotAllowedTest/etl/body.txt",
    "content": "// #if SOME\ntext1\n// #else\ntext2\n// #endif\n\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/SpacesBeforeDirectivesNotAllowedTest/src/body.txt",
    "content": "//#local SOME=true\n// #if SOME\ntext1\n// #else\ntext2\n// #endif\n\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/SpacesBeforeDirectivesTest/etl/body.txt",
    "content": "all ok\nhelloworldhelloworld\nline1\nline2\n hurraaa+HELLO\n hry hry +/* $SOME_VAR$ */\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/SpacesBeforeDirectivesTest/src/body.txt",
    "content": "  // #global SOME_VAR = \"HELLO\"\n// #_if SOME_VAR==\"HELLO\"\nall ok\n// #local hello=\"hello\"\n//#_endif\n// #local LOC = HELLO+\"world\"\n/* $LOC$*//*$LOC$*/\n// #ifdef LOC\nline1/*-*/give up\nline2/*  -  */give up\n// #else\nmust not be\n//#endif\n// $ hurraaa+/* $SOME_VAR$ */\n// $$ hry hry +/* $SOME_VAR$ */"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/cmn/sendfeedback.phtml",
    "content": "<?\n$fText=\"$fTitle\\n\\n\";\n$fText.=date(\"l dS of F Y h:i:s A\").\"\\n\\n\";\n\n$fText.=\"Name: $fName\\n\";\n$fText.=\"Email: $fEmail\\n\\n\";\n\n$fText.=$fComment;\n$fText.=\"\\n\\n\";\n\nif (mail(\"feedback@coldcore.ru\",$fSubject,$fText)) {Header(\"Location: $fOk\");}\nelse {Header(\"Location: $fBad\");}\nexit;\n?>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/cmn/styles.css",
    "content": "body {\n\tmargin-left: 0px;\n\tmargin-top: 0px;\n\tmargin-right: 0px;\n\tmargin-bottom: 0px;\n\tbackground-color: #FFFFFF;\n}\n.menuheader {\nFONT-WEIGHT: normal;\n FONT-SIZE: 14px;\n  COLOR: #BFBFFF;\n   FONT-FAMILY: \"Small Fonts\", \"Arial Black\", Arial, Helvetica, sans-serif}\n.menu {\n\tFONT-WEIGHT: bold;\n\tFONT-SIZE: 11px;\n\tCOLOR: white;\n\tFONT-FAMILY: Arial, Helvetica, sans-serif;\n\tTEXT-DECORATION: none;\n}\n.alltext {\n\tFONT-WEIGHT: normal;\n\tFONT-FAMILY: \"Times New Roman\", Times, serif;\n\tCOLOR: black;\n\tTEXT-DECORATION: none;\n\tfont-size: 12px;\n\tfont-style: normal;\n}\n.newdata {\nFONT-WEIGHT: bold;\n FONT-SIZE: 11px;\n  COLOR: #000000;\n   FONT-FAMILY: Arial, Helvetica, sans-serif}\n\n.footer {\n\tfont-size: x-small;\n\tfont-family: Arial, Helvetica, sans-serif;\n\tcolor: #999999;\n\n}\n.langtxt {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 11px;\n\tfont-style: normal;\n\tfont-weight: bold;\n}\n\n.rightnews {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 9px;\n}\n.rightnewsHdr {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n}\n\na:link {\n\ttext-decoration: none;\n\tcolor: #00BBFF;\n}\na:visited {\n\ttext-decoration: none;\n\tcolor: #00BBFF;\n}\na:hover {\n\ttext-decoration: none;\n\tcolor: #00FF00;\n}\na:active {\n\ttext-decoration: none;\n\tcolor: #00BBFF;\n}\n.catalogheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 16px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheadermin {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/cmn/styles2.css",
    "content": "body {\n\tmargin-left: 0px;\n\tmargin-top: 0px;\n\tmargin-right: 0px;\n\tmargin-bottom: 0px;\n\tbackground-color: #FFFFFF;\n}\n.menuheader {\nFONT-WEIGHT: normal;\n FONT-SIZE: 14px;\n  COLOR: #BFBFFF;\n   FONT-FAMILY: \"Small Fonts\", \"Arial Black\", Arial, Helvetica, sans-serif}\n.menu {\n\tFONT-WEIGHT: bold;\n\tFONT-SIZE: 11px;\n\tCOLOR: white;\n\tFONT-FAMILY: Arial, Helvetica, sans-serif;\n\tTEXT-DECORATION: none;\n}\n.alltext {\n\tFONT-WEIGHT: normal;\n\tFONT-FAMILY: \"Times New Roman\", Times, serif;\n\tCOLOR: black;\n\tTEXT-DECORATION: none;\n\tfont-size: 12px;\n\tfont-style: normal;\n}\n.newdata {\nFONT-WEIGHT: bold;\n FONT-SIZE: 11px;\n  COLOR: #000000;\n   FONT-FAMILY: Arial, Helvetica, sans-serif}\n\n.footer {\n\tfont-size: x-small;\n\tfont-family: Arial, Helvetica, sans-serif;\n\tcolor: #999999;\n\n}\n.langtxt {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 11px;\n\tfont-style: normal;\n\tfont-weight: bold;\n}\n\n.rightnews {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 9px;\n}\n.rightnewsHdr {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n}\n\na:link {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\na:visited {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\na:hover {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\na:active {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\n.catalogheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 16px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheadermin {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.devicename {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.devicelist {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 10px;\n\tfont-weight: normal;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.sendformref {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.sendformhdr {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.sendformtxt {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: normal;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n\n.sendformfield {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/end.txt",
    "content": "\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_airaggression.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/AIR AGGRESSION</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/airaggression_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">AIR AGGRESSION<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airaggression_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airaggression_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airaggression_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Eight alien monsters took control over all Earth's war-planes to enslave our planet. You were able to keep one plane from being captured and now you have got a chance to keep mankind free.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"AIR AGGRESSION(airaggression)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">\n<img src=\"../logos/playmobile.gif\" border=\"0\" alt=\"3$\">\n</a>\n<a href=\"http://www.888x.ru/javagames/show.php?ng=2057&actnum=1&md=76\" target=\"_new\">\n<img src=\"../logos/nikita.gif\" border=\"0\" alt=\"3$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_airboil.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/AIR BOIL</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/airboil_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">AIR BOIL<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airboil_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airboil_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airboil_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>In 2050, the remote planet with very low gravitation had been found. Inhabitants of the planet have been enslaved by four huge machine like aliens. The democratic Earth couldn’t reconcile with such state  and a space shuttle had delivered to this planet a super agent John Petroff who had been dumped on a surface of the planet together with a bicycle and a rocket mount for prompting democracy and bridges of friendship. So, the task of a player is to pass 20 game levels and to destroy all flying objects on levels.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"AIR BOIL(airboil)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.infon.ru/games.phtml?gid=468360\" target=\"_new\">\n<img src=\"../logos/infon.gif\" border=\"0\" alt=\"2.5$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_aneks_ny2006.htm",
    "content": "\n\n\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/The collection 'New Year's jokes'</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/aneks_ny2006_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">6230i, 8800</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">6600, 6620</div>\n<div class=\"devicelist\">6630</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">D108, S100, S105, X400, X426, X427, X430</div>\n<div class=\"devicelist\">E400, S200, S208</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<div class=\"devicelist\">E105, E315, E316, E317, E710, E715, P400, P510, P518, X427M, X450, X458, X475</div>\n<div class=\"devicelist\">E217, E335, E635, X640</div>\n<div class=\"devicelist\">C200, C207, C208, C225, E600, E608, X105</div>\n<div class=\"devicelist\">D410, D415, D418, P207, P777</div>\n<div class=\"devicelist\">E300, E310, E810, X480</div>\n<div class=\"devicelist\">X120, X140</div>\n<div class=\"devicelist\">E610, E618, P730, P735</div>\n<div class=\"devicelist\">D500, D508, E730</div>\n<div class=\"devicelist\">E530, E620, E720, E880</div>\n<div class=\"devicelist\">D600</div>\n<div class=\"devicelist\">Z105, Z107</div>\n<div class=\"devicelist\">Z110</div>\n<div class=\"devicelist\">Z130</div>\n<div class=\"devicelist\">Z140, Z300, Z500</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">The collection 'New Year's jokes'<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/aneks_ny2006_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/aneks_ny2006_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/aneks_ny2006_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>The application is a collection of jokes, the jokes are sorted on themes. The collection included 60 jokes.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"The collection 'New Year's jokes'(aneks_ny2006)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.infon.ru/games.phtml?gid=468361\" target=\"_new\">\n<img src=\"../logos/infon.gif\" border=\"0\" alt=\"2.5$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_blazinggears.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/BLAZING GEARS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/blazinggears_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">BLAZING GEARS<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/blazinggears_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/blazinggears_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/blazinggears_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a driver of a sport car and your task is to pass loops for a limited time. You have to avoid collisions with other cars on the road.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"BLAZING GEARS(blazinggears)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_caspianmonster.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/CASPIAN MONSTER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/caspianmonster_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">CASPIAN MONSTER<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/caspianmonster_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/caspianmonster_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/caspianmonster_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a pilot of a secret soviet airfoil boat, which is armed with missiles and a quick-firer. Your main objective is to leave the enemy base destroying as much military equipment as possible.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"CASPIAN MONSTER(caspianmonster)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">\n<img src=\"../logos/playmobile.gif\" border=\"0\" alt=\"2$\">\n</a>\n<a href=\"http://www.888x.ru/javagames/show.php?ng=2058&actnum=1&md=76\" target=\"_new\">\n<img src=\"../logos/nikita.gif\" border=\"0\" alt=\"3$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_castleassault.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/CASTLE ASSAULT</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/castleassault_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">CASTLE ASSAULT<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/castleassault_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/castleassault_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/castleassault_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are the commander of a catapult crew and your task is to destroy two vertical neighbor parts of the castle wall with a missile. The wall can be destroyed top-down only. Left altimeter shows current altitude of the missile. You have to be careful because the enemy throws its missiles over the wall. You can't fire until the catapult has been charged.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"CASTLE ASSAULT(castleassault)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_cockroach.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/COCKROACH</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/cockroach_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">COCKROACH<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/cockroach_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/cockroach_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/cockroach_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are driving a running cockroach in the maze and your task is as soon as possible to find a way out of the maze. There are a lot of scattered eatable things in the maze they increase and decrease game scores, so the game scores are decreased with time.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"COCKROACH(cockroach)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_coconutsfall.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/COCONUTS FALL</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/coconutsfall_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">COCONUTS FALL<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/coconutsfall_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/coconutsfall_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/coconutsfall_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a monkey and hunters want to catch you. Your task is to save own freedom as long as possible. You can use coconuts to knock men and you have to be careful because a helicopter tries to catch you with a net.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"COCONUTS FALL(coconutsfall)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_conecone.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/CONE! CONE!</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/conecone_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">CONE! CONE!<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/conecone_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/conecone_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/conecone_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a squirrel defending your supplies against crows. You can throw cones at them but be careful because you should keep a distance from a crow.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"CONE! CONE!(conecone)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_copterbomber.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/COPTER BOMBER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/copterbomber_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">COPTER BOMBER<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/copterbomber_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/copterbomber_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/copterbomber_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a pilot of a top secret copter-bomber and your task is to destroy all enemy ground targets. You must avoid collisions with flying enemies.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"COPTER BOMBER(copterbomber)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_drunkman.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/TIPPLER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/drunkman_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">TIPPLER<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/drunkman_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/drunkman_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/drunkman_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>A mobile version of the TIPPLER card game. You can select one from three opponents and to play with it for undressing.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"TIPPLER(drunkman)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_firingline.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/FIRING LINE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/firingline_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">FIRING LINE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/firingline_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/firingline_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/firingline_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are the defender of the docking tunnel of your spaceship from space creatures. Don’t allow them to approach to you! Fire! Fire!</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"FIRING LINE(firingline)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_fisher.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/FISHER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/fisher_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">FISHER<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fisher_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fisher_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fisher_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a fisher and have to catch as many as possible fishes. Take care of big predatory fishes, they break your fishing-line.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"FISHER(fisher)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_fruitmania.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/FRUITMANIA</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/fruitmania_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.cellcasino.ru\" target=\"_new\" class=\"gameinfoheadermin\">CellCasino</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">FRUITMANIA<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fruitmania_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fruitmania_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fruitmania_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>A mobile version of well-known casino game enables to make bet from real casino account and to play via internet from your mobile devices. You can win real money with the game.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"FRUITMANIA(fruitmania)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_hardday.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/HARD DAY</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/hardday_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">HARD DAY<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hardday_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hardday_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hardday_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a courier in a big company and your task is to deliver documents inside of an office. All white folders must be delivered to recipients as soon as possible. Remember, your manager will be very angry if meet you without a folder.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"HARD DAY(hardday)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_hunt.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/HUNT</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/hunt_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">HUNT<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hunt_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hunt_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hunt_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a brave hunter and your task is to kill as many as possible animals by 20 bullets. If you have missed 20 animals, one your bullet will be removed.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"HUNT(hunt)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_icegifts.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/ICE GIFTS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/icegifts_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">ICE GIFTS<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/icegifts_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/icegifts_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/icegifts_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Help Santa to send all XMas gifts. Combine their identical parties and do not suppose absence of empty ice-holes for new gifts.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"ICE GIFTS(icegifts)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_ironstream.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/IRON STREAM</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/ironstream_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">IRON STREAM<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ironstream_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ironstream_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ironstream_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Warning! Warning! The enemy has dashed our protection line and marching into a populated area! Your tank is our only hope in the area and your duty is to defend it. You have to destroy as many enemy tanks as possible but keep buildings untouched.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"IRON STREAM(ironstream)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_kalah.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/KALAH</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/kalah_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">KALAH<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kalah_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kalah_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kalah_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>A mobile version of the well known KALAH game. The object of the game is to move as many stones as possible into your KALAH (right bowl).</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"KALAH(kalah)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">\n<img src=\"../logos/playmobile.gif\" border=\"0\" alt=\"3$\">\n</a>\n<a href=\"http://www.888x.ru/javagames/show.php?ng=2059&actnum=1&md=76\" target=\"_new\">\n<img src=\"../logos/nikita.gif\" border=\"0\" alt=\"3$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_kickkick.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/KICK! KICK!</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/kickkick_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">KICK! KICK!<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kickkick_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kickkick_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kickkick_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You drive footballers fixed on a pivot. Your task is to defend own goal and to kick as many balls as possible into the opponent’s goal.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"KICK! KICK!(kickkick)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_lifesaver.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/LIFESAVER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/lifesaver_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">LIFESAVER<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/lifesaver_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/lifesaver_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/lifesaver_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Fire! Fire! Fire has occupied the ground level! You are the chief of a fire brigade and must not let the fire to occupy all building; you can use a water cannon. Hopeless men jump from windows and you have to catch them.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"LIFESAVER(lifesaver)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_livebridge.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/LIVE BRIDGE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/livebridge_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">LIVE BRIDGE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/livebridge_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/livebridge_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/livebridge_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a porter and your task is to carry cargo from the left riverside to the right riverside but there is not any bridge on the river so you use turtles as a live bridge. Unfortunately it is dangerous to use turtles as a bridge because they catch fishes and dive in the depth from time to time.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"LIVE BRIDGE(livebridge)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_mobilechase.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/MOBILE CHASE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mobilechase_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">MOBILE CHASE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilechase_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilechase_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilechase_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a brave policeman who has received the message about a bank robbery. Your have to overtake the gangsters and stop their van.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"MOBILE CHASE(mobilechase)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">\n<img src=\"../logos/playmobile.gif\" border=\"0\" alt=\"3$\">\n</a>\n<a href=\"http://www.888x.ru/javagames/show.php?ng=2060&actnum=1&md=76\" target=\"_new\">\n<img src=\"../logos/nikita.gif\" border=\"0\" alt=\"3$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_mobilesheriff.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/MOBILE SHERIFF</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mobilesheriff_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">MOBILE SHERIFF<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilesheriff_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilesheriff_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilesheriff_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a brave sheriff of Wild West who is releasing a small town from a band. The number of the bandits is known but you don’t know their faces so you must be careful because there are a lot of   inhabitants in the town and you must not kill them (we recommend you to wait an unkind action and don’t shoot before).</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"MOBILE SHERIFF(mobilesheriff)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_mtvpaparazzo.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/PAPARAZZO</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mtvpaparazzo_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.mtv.ru\" target=\"_new\" class=\"gameinfoheadermin\">MTV</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">PAPARAZZO<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpaparazzo_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpaparazzo_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpaparazzo_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a paparazzo and your task to get as many photos of celebrities as possible.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"PAPARAZZO(mtvpaparazzo)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_mtvpillow.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/PILLOW</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mtvpillow_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.mtv.ru\" target=\"_new\" class=\"gameinfoheadermin\">MTV</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">PILLOW<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpillow_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpillow_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpillow_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You're a visitor of MTV office and your task is to belabour music stars by a pillow.You can find new pillows in rooms.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"PILLOW(mtvpillow)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_mtvpuzzle.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/MTV PUZZLE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mtvpuzzle_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.mtv.ru\" target=\"_new\" class=\"gameinfoheadermin\">MTV</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">MTV PUZZLE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpuzzle_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpuzzle_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpuzzle_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Your task is to collect a full image with moved squares.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"MTV PUZZLE(mtvpuzzle)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_mtvstage.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/HOLD OUT ON THE STAGE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mtvstage_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.mtv.ru\" target=\"_new\" class=\"gameinfoheadermin\">MTV</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">HOLD OUT ON THE STAGE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvstage_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvstage_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvstage_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a rock-star and your worshipper throw different things on your stage.You have to avoid collision with bad things and catch flowers.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"HOLD OUT ON THE STAGE(mtvstage)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_nimble.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/NIMBLE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/nimble_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">NIMBLE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/nimble_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/nimble_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/nimble_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are an airport loader and your task is to sort baggage. You have to take color bags and place them on the conveyer having the same color as the bag. Bags should not overload conveyers.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"NIMBLE(nimble)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_opthunderclap.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/OPERATION THUNDERCLAP</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/opthunderclap_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">OPERATION THUNDERCLAP<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/opthunderclap_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/opthunderclap_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/opthunderclap_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a pilot of a military copter and your task is to kill as many as possible enemy copters.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"OPERATION THUNDERCLAP(opthunderclap)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_oysterbank.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/OYSTER BANK</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/oysterbank_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">OYSTER BANK<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/oysterbank_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/oysterbank_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/oysterbank_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a diver gathering pearls. You should collect as many pearls as possible. You have to avoid collisions with a shark. The oxygen cylinder is limited so you have to look after its level.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"OYSTER BANK(oysterbank)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_papaninsquest.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/PAPANIN'S QUEST</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/papaninsquest_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">PAPANIN'S QUEST<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/papaninsquest_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/papaninsquest_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/papaninsquest_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Ivan Papanin, the well-known Polar researcher, discovered an ancient Egyptian pyramid lost in the Antarctic ice. When examining the pyramid, he fell down and found himself inside of it. You have to help Papanin to find the way out of this terrible maze. The object of the game is to collect all magic stones in the maze to get the key that opens the door to the next level. You can use a pick to make holes in the floor. Swords scattered on the level will help you to fight with monsters. Be careful, after some period of time the destroyed monsters reappear. If you need to restore your life power, drink some water  from a jar. But all these items can be used only once.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"PAPANIN'S QUEST(papaninsquest)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">\n<img src=\"../logos/playmobile.gif\" border=\"0\" alt=\"2$\">\n</a>\n<a href=\"http://www.888x.ru/javagames/show.php?ng=2061&actnum=1&md=76\" target=\"_new\">\n<img src=\"../logos/nikita.gif\" border=\"0\" alt=\"3\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_ravenscheese.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/RAVEN'S CHEESE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/ravenscheese_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">RAVEN'S CHEESE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ravenscheese_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ravenscheese_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ravenscheese_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You drive a fox and your task to catch cheeses that throwed by ravens.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"RAVEN'S CHEESE(ravenscheese)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_searoad.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/SEA ROAD</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/searoad_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">SEA ROAD<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searoad_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searoad_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searoad_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a driver of a speedboat and your task is to pass as many gates as possible during limited time. You should avoid collisions with other ships.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"SEA ROAD(searoad)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_searovers.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/SEA ROVERS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/searovers_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">SEA ROVERS<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searovers_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searovers_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searovers_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a pirate hunting for cargo ships. When you have damaged a cargo ship (it has three-cornered sail), you should stop own ship near it to enable your crew to rob the ship. You have to avoid collisions with battleships. Good luck, captain!</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"SEA ROVERS(searovers)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_slider_alpop.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/Slider 'Aleosha Popovich'</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/slider_alpop_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">6230i, 8800</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">Slider 'Aleosha Popovich'<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/slider_alpop_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/slider_alpop_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/slider_alpop_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>The slide-show contains 10 frames (with texts) from the cartoon film \"Aleosha Popovich and Toogarin Zmey\". You can view the frames in both automatic and manual modes  as well  you can magnify selected frame and consider it.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"Slider 'Aleosha Popovich'(slider_alpop)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_smashingkick.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/SMASHING KICK</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/smashingkick_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">SMASHING KICK<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smashingkick_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smashingkick_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smashingkick_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a training footballer and your task is to kick as many as possible balls into the goal. You have to keep the ball in the air with your foots and head.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"SMASHING KICK(smashingkick)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_smscat.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/SMS Catalog</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/smscat_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3410</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">6230i, 8800</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M(T)50, C55, C56, CT56, 6688i, M46, 3118</div>\n<div class=\"devicelist\">SL45i</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">SMS Catalog<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smscat_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smscat_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smscat_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>The mobile catalog enables to a user to look through contents of a mobile content provider's base and to order liked content with automatically generated SMS (if the device is supporting). The application supports three SMS schemes: Siemens, Samsung and WMA. The application enables to organize complicated tree-structured catalogs. It can be started on any device supports MIDP-1.0 or older.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"SMS Catalog(smscat)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_spiders.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/SPIDERS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/spiders_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">SPIDERS<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/spiders_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/spiders_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/spiders_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are an ant bringing twigs into own anthill. You should bring as many twigs as possible and to avoid clutches of spiders.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"SPIDERS(spiders)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_starharbor.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/STAR HARBOR</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/starharbor_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3410</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M(T)50, C55, C56, CT56, 6688i, M46, 3118</div>\n<div class=\"devicelist\">SL45i</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">STAR HARBOR<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/starharbor_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/starharbor_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/starharbor_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>A terrible invasion threatens the Earth.A player is a gunner of a star cruiser gun and your task is to stop the invasion.You have to destroy both cruisers and fighters.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"STAR HARBOR(starharbor)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.infon.ru/games.phtml?gid=468366\" target=\"_new\">\n<img src=\"../logos/infon.gif\" border=\"0\" alt=\"2.5$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_strangehunt.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/STRANGE HUNT</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/strangehunt_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">STRANGE HUNT<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/strangehunt_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/strangehunt_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/strangehunt_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You have come on military range but do not surrender! Shoot as many as possible ducks and wild boars!</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"STRANGE HUNT(strangehunt)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_tastydish.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/TASTY DISH</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/tastydish_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">TASTY DISH<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/tastydish_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/tastydish_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/tastydish_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are a crocodile living in a river. Your task is to catch as many animals on the beach as possible. Time to time the hunter visits the beach and attempts to kill you with a gun.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"TASTY DISH(tastydish)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_vineyard.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/VINEYARD</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/vineyard_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">VINEYARD<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/vineyard_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/vineyard_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/vineyard_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Gather grapes and put its into mollies, you must collect all grapes to pass a game level. You must avoid collisions with snails!</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"VINEYARD(vineyard)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_waterway.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/WATER WAY</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/waterway_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">WATER WAY<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/waterway_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/waterway_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/waterway_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You are an ant collecting dew for its ant heap. Your task is to catch drops with a leaf and pour out it in the flower of your workmate. Remember, the leaf can contain one drop only.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"WATER WAY(waterway)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_wildballs.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/WILD BALLS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/wildballs_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">WILD BALLS<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildballs_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildballs_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildballs_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>You should clear as many as possible pins with own balls. You must use a rolling ball to clear pins; you have to direct the ball at a pin with your ball. If you miss, your ball will be lost.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"WILD BALLS(wildballs)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/gpage_wildroad.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/WILD ROAD</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/wildroad_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">WILD ROAD<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildroad_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildroad_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildroad_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Break away from persecutors, do not allow them to destroy your car or to jump on it. Pick up jerricans because fuel constantly drips out through the raked tanks.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\nName:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\nMessage:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"WILD ROAD(wildroad)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;PURCHASE&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu1_about.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/ABOUT</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ABOUT<br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu1_about.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>ABOUT</strong></div>\n            </div>\n<div align=\"justify\" class=\"alltext\">\n&nbsp;&nbsp;ColdCore� is a leader in Java2ME content development. We have unique skills and technologies that enable us to develop hi-end production under time. Our production is published under leading worldwide trademarks and our portfolio contains more than 100 games and applications for mobile devices. Our mission is to become a global leader in mobile Java2ME game content development through development the best technologies, the best workflows and the best products that meet requirements of the market.<br>We not only develop mobile applications for own sales but also we implement outside orders like:\n<ul>\n<li>Development of mobile games and mobile applications to order.</li>\n<li>Development of parts for customer's systems.</li>\n</ul>\n</div>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu1_contacts.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/CONTACTS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">CONTACTS<br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu1_contacts.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>CONTACTS</strong></div>\n            </div>\n<div align=\"left\" class=\"alltext\">\n<br>\nInformation: <a href=mailto:support@coldcore.ru>support@coldcore.ru</a><br>\nWebsite: <a href=mailto:webmaster@coldcore.ru>webmaster@coldcore.ru</a><br>\nMarketing: <a href=mailto:sales@coldcore.ru>sales@coldcore.ru</a><br>\n</div>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu1_job.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/JOB</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">JOB<br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu1_job.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>JOB</strong></div>\n            </div>\n<p align=\"center\"><strong><em><font size=\"4\">Sorry, but the page is still under \n  construction....</font></em></strong></p>\n<p align=\"center\"><img src=\"../undercon.gif\" width=\"40\" height=\"38\"></p>\n<p align=\"center\"><strong><font size=\"4\"><em>Visit us later, please...</em></font></strong></p>\n\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu1_news.htm",
    "content": "\n\n\n\n\n\n\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/NEWS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">NEWS<br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu1_news.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>NEWS</strong></div>\n            </div>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">05-DEC-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n<img src=\"../news/../games/aneks_ny2006_scr1.gif\" alt=\"scr1\">\n<img src=\"../news/../games/aneks_ny2006_scr3.gif\" alt=\"scr2\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       The collection \"Ney Year's jokes\" has been completed. The collection includes 60 jokes. It supports all MIDP-1.0 Java2ME mobile devices.\n       </div>\n       <div align=\"justify\">\n\t\t<span class=\"rightnewsHdr\"><a href=\"./gpage_aneks_ny2006.htm\" target=\"_new\">read more...</a>\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">25-NOV-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n<img src=\"../news/../games/slider_alpop_scr1.gif\" alt=\"scr1\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       The slide-show \"Aleosha Popovich and Toogarin Zmey\" has been completed. The slide-show includes 10 frames from the cartoon film and texts.\n       </div>\n       <div align=\"justify\">\n\t\t<span class=\"rightnewsHdr\"><a href=\"./gpage_slider_alpop.htm\" target=\"_new\">read more...</a>\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">10-SEP-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n<img src=\"../news/../games/smscat_scr2.gif\" alt=\"scr1\">\n<img src=\"../news/../games/smscat_scr3.gif\" alt=\"scr2\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       The \"SMS Catalog\" application has been developed. It enables for user to look through a content provider base and order liked content with automatically generated SMS (if the device is supporting).\n       </div>\n       <div align=\"justify\">\n\t\t<span class=\"rightnewsHdr\"><a href=\"./gpage_smscat.htm\" target=\"_new\">read more...</a>\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">01-AUG-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n<img src=\"../news/../games/airboil_scr1.gif\" alt=\"scr1\">\n<img src=\"../news/../games/airboil_scr3.gif\" alt=\"scr2\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       The game \"Air Boil\" has been completed. The game is a classic style arcade game. A player should pass game stages. Game stages have different difficult of the gameplay, every group of game stages has a game \"boss\" what must be destroyed by the player.\n       </div>\n       <div align=\"justify\">\n\t\t<span class=\"rightnewsHdr\"><a href=\"./gpage_airboil.htm\" target=\"_new\">read more...</a>\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">29-JUN-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n<img src=\"../news/../games/starharbor_scr1.gif\" alt=\"scr1\">\n<img src=\"../news/../games/starharbor_scr2.gif\" alt=\"scr2\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       The \"Star Harbor\" game has come into the market. The game is a pseudo 3d shooter. A player is a brawe star cruiser gunner and the task is to destroy both enemy cruisers and fighters that are attacking the Earth. It is a timekiller game and it has three levels of complexity. The game supports more than 100 models of mobile devices including a few black white devices of Nokia and Siemens.\n       </div>\n       <div align=\"justify\">\n\t\t<span class=\"rightnewsHdr\"><a href=\"./gpage_starharbor.htm\" target=\"_new\">read more...</a>\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">29-JUN-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       The alpha version of the site has been placed in the net. Unfortunately a few pages of the site are not working but we're working for it.\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu1_partnership.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/PARTNERSHIP</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">PARTNERSHIP<br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu1_partnership.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>PARTNERSHIP</strong></div>\n            </div>\n<p align=\"center\"><strong><em><font size=\"4\">Sorry, but the page is still under \n  construction....</font></em></strong></p>\n<p align=\"center\"><img src=\"../undercon.gif\" width=\"40\" height=\"38\"></p>\n<p align=\"center\"><strong><font size=\"4\"><em>Visit us later, please...</em></font></strong></p>\n\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_all.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/ALL</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ALL&nbsp;(43)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_all.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>ALL</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFRUITMANIA\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_fruitmania.htm\" target=\"_new\">\n    <img src=\"../games/fruitmania_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Mobile version of the \"Fruitmania\" casino game enables to play on real money.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_fruitmania.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSTRANGE HUNT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_strangehunt.htm\" target=\"_new\">\n    <img src=\"../games/strangehunt_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You have come on military range but do not surrender!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_strangehunt.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tICE GIFTS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_icegifts.htm\" target=\"_new\">\n    <img src=\"../games/icegifts_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Help Santa to send all XMas gifts.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_icegifts.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildroad.htm\" target=\"_new\">\n    <img src=\"../games/wildroad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Break away from persecutors, do not allow them to destroy your car.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildroad.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tVINEYARD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_vineyard.htm\" target=\"_new\">\n    <img src=\"../games/vineyard_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    It is the time to collect grapes but evil snails can prevent it.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_vineyard.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOPTER BOMBER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_copterbomber.htm\" target=\"_new\">\n    <img src=\"../games/copterbomber_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Destroy all enemy tanks and buildings with new supercoter.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_copterbomber.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tTIPPLER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_drunkman.htm\" target=\"_new\">\n    <img src=\"../games/drunkman_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A mobile version of the card game TIPPLER.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_drunkman.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tAIR BOIL\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_airboil.htm\" target=\"_new\">\n    <img src=\"../games/airboil_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Release a distant planet from machines' domination.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_airboil.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSTAR HARBOR\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_starharbor.htm\" target=\"_new\">\n    <img src=\"../games/starharbor_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A terrible invasion threatens the Earth.A player is a gunner of a star cruiser gun and your task is to stop the invasion.You have to destroy both cruisers and fighters.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_starharbor.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tKALAH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_kalah.htm\" target=\"_new\">\n    <img src=\"../games/kalah_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A mobile version of the well known KALAH game. The object of the game is to move as many stones as possible into your KALAH (right bowl).\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_kalah.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPAPANIN'S QUEST\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_papaninsquest.htm\" target=\"_new\">\n    <img src=\"../games/papaninsquest_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You have to help Papanin to find the way out of the terrible maze. The object of the game is to collect all magic stones in the maze.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_papaninsquest.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMOBILE CHASE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mobilechase.htm\" target=\"_new\">\n    <img src=\"../games/mobilechase_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a brave policeman who has received the message about a bank robbery. Your have to overtake the gangsters and stop their van.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mobilechase.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCASPIAN MONSTER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_caspianmonster.htm\" target=\"_new\">\n    <img src=\"../games/caspianmonster_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a pilot of a secret soviet airfoil boat, which is armed with missiles and a quick-firer.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_caspianmonster.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tAIR AGGRESSION\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_airaggression.htm\" target=\"_new\">\n    <img src=\"../games/airaggression_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Eight alien monsters took control over all Earth's war-planes to enslave our planet.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_airaggression.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tBLAZING GEARS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_blazinggears.htm\" target=\"_new\">\n    <img src=\"../games/blazinggears_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a driver of a sport car and your task is to pass loops for a limited time. You have to avoid collisions with other cars on the road.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_blazinggears.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCASTLE ASSAULT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_castleassault.htm\" target=\"_new\">\n    <img src=\"../games/castleassault_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    To break a castle wall by a catapult.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_castleassault.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOCKROACH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_cockroach.htm\" target=\"_new\">\n    <img src=\"../games/cockroach_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A cockroach have to find a way out of the maze\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_cockroach.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOCONUTS FALL\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_coconutsfall.htm\" target=\"_new\">\n    <img src=\"../games/coconutsfall_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Save own freedom with coconuts.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_coconutsfall.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCONE! CONE!\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_conecone.htm\" target=\"_new\">\n    <img src=\"../games/conecone_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a squirrel defending your supplies against crows.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_conecone.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFIRING LINE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_firingline.htm\" target=\"_new\">\n    <img src=\"../games/firingline_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are the defender of the docking tunnel of your spaceship from space creatures.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_firingline.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFISHER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_fisher.htm\" target=\"_new\">\n    <img src=\"../games/fisher_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a fisher and have to catch as many as possible fishes.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_fisher.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHARD DAY\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_hardday.htm\" target=\"_new\">\n    <img src=\"../games/hardday_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a courier in a big company and your task is to deliver documents inside of an office.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_hardday.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHUNT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_hunt.htm\" target=\"_new\">\n    <img src=\"../games/hunt_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a brave hunter and your task is to kill as many as possible animals by 20 bullets.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_hunt.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tIRON STREAM\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_ironstream.htm\" target=\"_new\">\n    <img src=\"../games/ironstream_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Warning! Warning! The enemy has dashed our protection line and marching into a populated area!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_ironstream.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tKICK! KICK!\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_kickkick.htm\" target=\"_new\">\n    <img src=\"../games/kickkick_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You drive footballers fixed on a pivot.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_kickkick.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tLIFESAVER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_lifesaver.htm\" target=\"_new\">\n    <img src=\"../games/lifesaver_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Fire! Fire! Fire has occupied the ground level!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_lifesaver.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tLIVE BRIDGE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_livebridge.htm\" target=\"_new\">\n    <img src=\"../games/livebridge_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a porter and your task is to carry cargo from the left riverside to the right riverside.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_livebridge.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tNIMBLE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_nimble.htm\" target=\"_new\">\n    <img src=\"../games/nimble_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are an airport loader and your task is to sort baggage.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_nimble.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tOPERATION THUNDERCLAP\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_opthunderclap.htm\" target=\"_new\">\n    <img src=\"../games/opthunderclap_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a pilot of a military copter and your task is to kill as many as possible enemy copters.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_opthunderclap.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tOYSTER BANK\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_oysterbank.htm\" target=\"_new\">\n    <img src=\"../games/oysterbank_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a diver gathering pearls.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_oysterbank.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tRAVEN'S CHEESE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_ravenscheese.htm\" target=\"_new\">\n    <img src=\"../games/ravenscheese_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You drive a fox and your task to catch cheeses that throwed by ravens.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_ravenscheese.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSEA ROVERS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_searovers.htm\" target=\"_new\">\n    <img src=\"../games/searovers_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a pirate hunting for cargo ships.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_searovers.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSEA ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_searoad.htm\" target=\"_new\">\n    <img src=\"../games/searoad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a driver of a speedboat.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_searoad.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMOBILE SHERIFF\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mobilesheriff.htm\" target=\"_new\">\n    <img src=\"../games/mobilesheriff_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a brave sheriff of Wild West who is releasing a small town from a band.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mobilesheriff.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSMASHING KICK\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_smashingkick.htm\" target=\"_new\">\n    <img src=\"../games/smashingkick_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a training footballer and your task is to kick as many as possible balls into the goal.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_smashingkick.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSPIDERS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_spiders.htm\" target=\"_new\">\n    <img src=\"../games/spiders_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are an ant bringing twigs into own anthill.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_spiders.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tTASTY DISH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_tastydish.htm\" target=\"_new\">\n    <img src=\"../games/tastydish_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a crocodile living in a river.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_tastydish.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWATER WAY\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_waterway.htm\" target=\"_new\">\n    <img src=\"../games/waterway_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are an ant collecting dew for its ant heap.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_waterway.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD BALLS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildballs.htm\" target=\"_new\">\n    <img src=\"../games/wildballs_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You should clear as many as possible pins with own balls.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildballs.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMTV PUZZLE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpuzzle.htm\" target=\"_new\">\n    <img src=\"../games/mtvpuzzle_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A puzzle game.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpuzzle.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPAPARAZZO\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpaparazzo.htm\" target=\"_new\">\n    <img src=\"../games/mtvpaparazzo_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a paparazzo and your task to get as many photos of celebrities as possible.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpaparazzo.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPILLOW\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpillow.htm\" target=\"_new\">\n    <img src=\"../games/mtvpillow_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You're a visitor of MTV office and your task is to belabour music stars by a pillow.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpillow.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHOLD OUT ON THE STAGE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvstage.htm\" target=\"_new\">\n    <img src=\"../games/mtvstage_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a rock-star and your worshipper throw different things on your stage.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvstage.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_arcade.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/ARCADE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ARCADE&nbsp;(32)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_arcade.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>ARCADE</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildroad.htm\" target=\"_new\">\n    <img src=\"../games/wildroad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Break away from persecutors, do not allow them to destroy your car.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildroad.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tVINEYARD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_vineyard.htm\" target=\"_new\">\n    <img src=\"../games/vineyard_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    It is the time to collect grapes but evil snails can prevent it.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_vineyard.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOPTER BOMBER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_copterbomber.htm\" target=\"_new\">\n    <img src=\"../games/copterbomber_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Destroy all enemy tanks and buildings with new supercoter.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_copterbomber.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tAIR BOIL\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_airboil.htm\" target=\"_new\">\n    <img src=\"../games/airboil_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Release a distant planet from machines' domination.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_airboil.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMOBILE CHASE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mobilechase.htm\" target=\"_new\">\n    <img src=\"../games/mobilechase_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a brave policeman who has received the message about a bank robbery. Your have to overtake the gangsters and stop their van.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mobilechase.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCASPIAN MONSTER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_caspianmonster.htm\" target=\"_new\">\n    <img src=\"../games/caspianmonster_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a pilot of a secret soviet airfoil boat, which is armed with missiles and a quick-firer.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_caspianmonster.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tAIR AGGRESSION\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_airaggression.htm\" target=\"_new\">\n    <img src=\"../games/airaggression_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Eight alien monsters took control over all Earth's war-planes to enslave our planet.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_airaggression.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCASTLE ASSAULT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_castleassault.htm\" target=\"_new\">\n    <img src=\"../games/castleassault_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    To break a castle wall by a catapult.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_castleassault.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOCKROACH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_cockroach.htm\" target=\"_new\">\n    <img src=\"../games/cockroach_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A cockroach have to find a way out of the maze\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_cockroach.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOCONUTS FALL\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_coconutsfall.htm\" target=\"_new\">\n    <img src=\"../games/coconutsfall_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Save own freedom with coconuts.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_coconutsfall.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCONE! CONE!\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_conecone.htm\" target=\"_new\">\n    <img src=\"../games/conecone_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a squirrel defending your supplies against crows.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_conecone.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFISHER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_fisher.htm\" target=\"_new\">\n    <img src=\"../games/fisher_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a fisher and have to catch as many as possible fishes.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_fisher.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHARD DAY\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_hardday.htm\" target=\"_new\">\n    <img src=\"../games/hardday_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a courier in a big company and your task is to deliver documents inside of an office.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_hardday.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHUNT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_hunt.htm\" target=\"_new\">\n    <img src=\"../games/hunt_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a brave hunter and your task is to kill as many as possible animals by 20 bullets.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_hunt.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tIRON STREAM\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_ironstream.htm\" target=\"_new\">\n    <img src=\"../games/ironstream_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Warning! Warning! The enemy has dashed our protection line and marching into a populated area!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_ironstream.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tLIFESAVER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_lifesaver.htm\" target=\"_new\">\n    <img src=\"../games/lifesaver_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Fire! Fire! Fire has occupied the ground level!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_lifesaver.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tLIVE BRIDGE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_livebridge.htm\" target=\"_new\">\n    <img src=\"../games/livebridge_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a porter and your task is to carry cargo from the left riverside to the right riverside.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_livebridge.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tNIMBLE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_nimble.htm\" target=\"_new\">\n    <img src=\"../games/nimble_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are an airport loader and your task is to sort baggage.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_nimble.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tOPERATION THUNDERCLAP\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_opthunderclap.htm\" target=\"_new\">\n    <img src=\"../games/opthunderclap_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a pilot of a military copter and your task is to kill as many as possible enemy copters.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_opthunderclap.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tOYSTER BANK\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_oysterbank.htm\" target=\"_new\">\n    <img src=\"../games/oysterbank_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a diver gathering pearls.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_oysterbank.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tRAVEN'S CHEESE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_ravenscheese.htm\" target=\"_new\">\n    <img src=\"../games/ravenscheese_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You drive a fox and your task to catch cheeses that throwed by ravens.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_ravenscheese.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSEA ROVERS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_searovers.htm\" target=\"_new\">\n    <img src=\"../games/searovers_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a pirate hunting for cargo ships.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_searovers.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSEA ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_searoad.htm\" target=\"_new\">\n    <img src=\"../games/searoad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a driver of a speedboat.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_searoad.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMOBILE SHERIFF\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mobilesheriff.htm\" target=\"_new\">\n    <img src=\"../games/mobilesheriff_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a brave sheriff of Wild West who is releasing a small town from a band.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mobilesheriff.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSMASHING KICK\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_smashingkick.htm\" target=\"_new\">\n    <img src=\"../games/smashingkick_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a training footballer and your task is to kick as many as possible balls into the goal.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_smashingkick.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSPIDERS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_spiders.htm\" target=\"_new\">\n    <img src=\"../games/spiders_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are an ant bringing twigs into own anthill.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_spiders.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tTASTY DISH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_tastydish.htm\" target=\"_new\">\n    <img src=\"../games/tastydish_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a crocodile living in a river.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_tastydish.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWATER WAY\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_waterway.htm\" target=\"_new\">\n    <img src=\"../games/waterway_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are an ant collecting dew for its ant heap.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_waterway.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD BALLS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildballs.htm\" target=\"_new\">\n    <img src=\"../games/wildballs_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You should clear as many as possible pins with own balls.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildballs.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPAPARAZZO\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpaparazzo.htm\" target=\"_new\">\n    <img src=\"../games/mtvpaparazzo_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a paparazzo and your task to get as many photos of celebrities as possible.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpaparazzo.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPILLOW\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpillow.htm\" target=\"_new\">\n    <img src=\"../games/mtvpillow_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You're a visitor of MTV office and your task is to belabour music stars by a pillow.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpillow.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHOLD OUT ON THE STAGE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvstage.htm\" target=\"_new\">\n    <img src=\"../games/mtvstage_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a rock-star and your worshipper throw different things on your stage.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvstage.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_clientserver.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/CLIENT-SERVER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">CLIENT-SERVER&nbsp;(1)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_clientserver.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>CLIENT-SERVER</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFRUITMANIA\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_fruitmania.htm\" target=\"_new\">\n    <img src=\"../games/fruitmania_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Mobile version of the \"Fruitmania\" casino game enables to play on real money.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_fruitmania.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_erotic.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/EROTIC</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">EROTIC&nbsp;(1)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_erotic.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>EROTIC</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tTIPPLER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_drunkman.htm\" target=\"_new\">\n    <img src=\"../games/drunkman_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A mobile version of the card game TIPPLER.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_drunkman.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_fighting.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/FIGHTING</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">FIGHTING&nbsp;(0)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_fighting.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>FIGHTING</strong></div>\n            </div>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_gambling.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/GAMBLING</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">GAMBLING&nbsp;(2)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_gambling.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>GAMBLING</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFRUITMANIA\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_fruitmania.htm\" target=\"_new\">\n    <img src=\"../games/fruitmania_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Mobile version of the \"Fruitmania\" casino game enables to play on real money.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_fruitmania.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tTIPPLER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_drunkman.htm\" target=\"_new\">\n    <img src=\"../games/drunkman_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A mobile version of the card game TIPPLER.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_drunkman.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_logic.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/PUZZLE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">PUZZLE&nbsp;(3)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_logic.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>PUZZLE</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tICE GIFTS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_icegifts.htm\" target=\"_new\">\n    <img src=\"../games/icegifts_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Help Santa to send all XMas gifts.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_icegifts.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tKALAH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_kalah.htm\" target=\"_new\">\n    <img src=\"../games/kalah_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A mobile version of the well known KALAH game. The object of the game is to move as many stones as possible into your KALAH (right bowl).\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_kalah.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMTV PUZZLE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpuzzle.htm\" target=\"_new\">\n    <img src=\"../games/mtvpuzzle_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A puzzle game.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpuzzle.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_multiplayer.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/MULTIPLAYER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">MULTIPLAYER&nbsp;(0)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_multiplayer.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>MULTIPLAYER</strong></div>\n            </div>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_quest.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/QUEST</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">QUEST&nbsp;(1)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_quest.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>QUEST</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPAPANIN'S QUEST\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_papaninsquest.htm\" target=\"_new\">\n    <img src=\"../games/papaninsquest_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You have to help Papanin to find the way out of the terrible maze. The object of the game is to collect all magic stones in the maze.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_papaninsquest.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_racing.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/RACING</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">RACING&nbsp;(4)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_racing.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>RACING</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildroad.htm\" target=\"_new\">\n    <img src=\"../games/wildroad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Break away from persecutors, do not allow them to destroy your car.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildroad.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMOBILE CHASE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mobilechase.htm\" target=\"_new\">\n    <img src=\"../games/mobilechase_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a brave policeman who has received the message about a bank robbery. Your have to overtake the gangsters and stop their van.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mobilechase.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tBLAZING GEARS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_blazinggears.htm\" target=\"_new\">\n    <img src=\"../games/blazinggears_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a driver of a sport car and your task is to pass loops for a limited time. You have to avoid collisions with other cars on the road.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_blazinggears.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSEA ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_searoad.htm\" target=\"_new\">\n    <img src=\"../games/searoad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a driver of a speedboat.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_searoad.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_shooter.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/SHOOTER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">SHOOTER&nbsp;(3)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_shooter.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>SHOOTER</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSTRANGE HUNT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_strangehunt.htm\" target=\"_new\">\n    <img src=\"../games/strangehunt_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You have come on military range but do not surrender!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_strangehunt.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSTAR HARBOR\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_starharbor.htm\" target=\"_new\">\n    <img src=\"../games/starharbor_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A terrible invasion threatens the Earth.A player is a gunner of a star cruiser gun and your task is to stop the invasion.You have to destroy both cruisers and fighters.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_starharbor.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFIRING LINE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_firingline.htm\" target=\"_new\">\n    <img src=\"../games/firingline_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are the defender of the docking tunnel of your spaceship from space creatures.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_firingline.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu2_sport.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/GAMES/SPORT</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">SPORT&nbsp;(3)<br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ALL&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu2_sport.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>SPORT</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tKICK! KICK!\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_kickkick.htm\" target=\"_new\">\n    <img src=\"../games/kickkick_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You drive footballers fixed on a pivot.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_kickkick.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSMASHING KICK\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_smashingkick.htm\" target=\"_new\">\n    <img src=\"../games/smashingkick_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You are a training footballer and your task is to kick as many as possible balls into the goal.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_smashingkick.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD BALLS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildballs.htm\" target=\"_new\">\n    <img src=\"../games/wildballs_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    You should clear as many as possible pins with own balls.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildballs.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/menu3_appsall.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/APPLICATIONS/ALL</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">NEWS</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">ABOUT</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">PARTNERSHIP</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">JOB</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">CONTACTS</a><br>\n<br></div>\n\n<div>\nGAMES<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ALL&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">ARCADE&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">EROTIC&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">FIGHTING&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">GAMBLING&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">PUZZLE&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">MULTIPLAYER&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">CLIENT-SERVER&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">QUEST&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">RACING&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">SHOOTER&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">SPORT&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nAPPLICATIONS<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ALL&nbsp;(3)<br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../rus/menu3_appsall.htm\">RUS</a></div></td>\n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">ENG</font></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>ALL</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tThe collection 'New Year's jokes'\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_aneks_ny2006.htm\" target=\"_new\">\n    <img src=\"../games/aneks_ny2006_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    The collection \"New Year's jokes\" contains 60 jokes.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_aneks_ny2006.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSlider 'Aleosha Popovich'\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_slider_alpop.htm\" target=\"_new\">\n    <img src=\"../games/slider_alpop_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A slide-show of the cartoon film \"Aleosha Popovich and Toogarin Zmey\"\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_slider_alpop.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSMS Catalog\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_smscat.htm\" target=\"_new\">\n    <img src=\"../games/smscat_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    A mobile catalog of mobile content enables to send SMS for order and can be upgraded via WAP.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_smscat.htm\" target=\"_new\">read more...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">The Papanin's quest game for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">read more...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">read more...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">© 2005-2007 ColdCore®. All rights reserved. \"™\" and \"®\" indicate trademarks or registered trademarks of their respective owners.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/send_error.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>I can't deliver the message.</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#FF9393\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../x_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>I can't deliver the message. May be the server has troubles, if it is possible resend the message later. Thank you.</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/eng/send_ok.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Your message has been delivered successfully.</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#C4CFFF\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../i_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>Your message has been delivered successfully. Thank you very much!</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/games/games2003_2006.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\n<title>Old mobile games (august 2003-march 2006)</title>\n</head>\n\n<body>\n<h1 align=\"center\">Old mobile games (august 2003 - march 2006) </h1>\n<h4>Summary team at the period </h4>\n<p><em><strong>Producing: </strong></em>Arteom Litvinov, Igor Maznitsa <br>\n<em><strong>Project management: </strong></em>Igor Maznitsa<br>\n<em><strong>Project coordination: </strong></em>Aleksey Goryachev<br>\n<em><strong>Game design:</strong></em> Aleksey Goryachev, Igor Maznitsa<br>\n<em><strong>Level design:</strong></em> Aleksey Goryachev<br>\n  <em><strong>Programming:</strong></em> Alexander Vasiliev, Denis Parinov, Sergey Kuligin, Denis Rozhnev, Igor Maznitsa<br>\n<em><strong>Art:</strong></em> Svetlana Semenova, Andrey Diakov, Dmitriy Semenov, Igor Maznitsa <br>\n  <em><strong>Sound:</strong></em> Igor Maznitsa <br>\n<em><strong>Testing: </strong></em>Aleksey Goryachev</p>\n<hr>\n<p>-----------------------------</p>\n<p><strong>1. Papanin's quest</strong></p>\n<p><img src=\"papaninsquest_splash.jpg\" width=\"100\" height=\"118\">\n  <img src=\"papaninsquest_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"papaninsquest_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"papaninsquest_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>2. Air Aggression</strong></p>\n<p><img src=\"airaggression_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"airaggression_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"airaggression_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"airaggression_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>3. Kalah</strong></p>\n<p><img src=\"kalah_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"kalah_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"kalah_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"kalah_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>4. Mobile chase</strong></p>\n<p><img src=\"mobilechase_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"mobilechase_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"mobilechase_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"mobilechase_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>5. Caspian monster</strong></p>\n<p><img src=\"caspianmonster_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"caspianmonster_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"caspianmonster_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"caspianmonster_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>6. Hunt</strong></p>\n<p><img src=\"hunt_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"hunt_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"hunt_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"hunt_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>7. Raven's cheese</strong></p>\n<p><img src=\"ravenscheese_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"ravenscheese_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"ravenscheese_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"ravenscheese_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>8. Sea road</strong></p>\n<p><img src=\"searoad_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"searoad_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"searoad_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"searoad_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>9. Blazing gears</strong></p>\n<p><img src=\"blazinggears_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"blazinggears_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"blazinggears_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"blazinggears_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>10. Castle assault</strong></p>\n<p><img src=\"castleassault_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"castleassault_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"castleassault_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"castleassault_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>11. Cockroach</strong></p>\n<p><img src=\"cockroach_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"cockroach_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"cockroach_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"cockroach_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>12. Coconuts fall</strong></p>\n<p><img src=\"coconutsfall_splash.jpg\" width=\"100\" height=\"100\">  <img src=\"coconutsfall_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"coconutsfall_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"coconutsfall_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>13. Cone! Cone!</strong></p>\n<p> <img src=\"conecone_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"conecone_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"conecone_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"conecone_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>14. Firing line</strong></p>\n<p><img src=\"firingline_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"firingline_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"firingline_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"firingline_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>15. Fruit mania</strong></p>\n<p><img src=\"fruitmania_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"fruitmania_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"fruitmania_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"fruitmania_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>16. Hard day</strong></p>\n<p><img src=\"hardday_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"hardday_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"hardday_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"hardday_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>17. Ice gifts</strong></p>\n<p><img src=\"icegifts_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"icegifts_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"icegifts_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"icegifts_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>18. Iron stream</strong></p>\n<p><img src=\"ironstream_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"ironstream_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"ironstream_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"ironstream_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>19. Kick Kick</strong></p>\n<p><img src=\"kickkick_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"kickkick_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"kickkick_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"kickkick_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>20. Lifesaver</strong></p>\n<p><img src=\"lifesaver_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"lifesaver_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"lifesaver_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"lifesaver_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>21. Live bridge</strong></p>\n<p><img src=\"livebridge_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"livebridge_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"livebridge_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"livebridge_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>22. Mobile sheriff</strong></p>\n<p><img src=\"mobilesheriff_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"mobilesheriff_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"mobilesheriff_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"mobilesheriff_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>23. Paparazzo</strong></p>\n<p><img src=\"mtvpaparazzo_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"mtvpaparazzo_scr1.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpaparazzo_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpaparazzo_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>24. Pillow war</strong></p>\n<p><img src=\"mtvpillow_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"mtvpillow_scr1.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpillow_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpillow_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>25. MTV Puzzle</strong></p>\n<p><img src=\"mtvpuzzle_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"mtvpuzzle_scr1.gif\" width=\"174\" height=\"204\"> <img src=\"mtvpuzzle_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpuzzle_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>26. Scene</strong></p>\n<p><img src=\"mtvstage_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"mtvstage_scr1.gif\" width=\"176\" height=\"204\"> <img src=\"mtvstage_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvstage_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>27. Nimble</strong></p>\n<p><img src=\"nimble_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"nimble_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"nimble_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"nimble_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>28. Operation &quot;Thunderclap&quot;</strong></p>\n<p> <img src=\"opthunderclap_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"opthunderclap_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"opthunderclap_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"opthunderclap_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>29. Oyster bank</strong></p>\n<p><img src=\"oysterbank_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"oysterbank_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"oysterbank_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"oysterbank_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>30. Sea rovers</strong></p>\n<p><img src=\"searovers_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"searovers_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"searovers_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"searovers_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>31. Smashing kick</strong></p>\n<p><img src=\"smashingkick_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"smashingkick_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"smashingkick_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"smashingkick_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>32. Spiders</strong></p>\n<p><img src=\"spiders_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"spiders_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"spiders_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"spiders_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>33. Star harbor</strong></p>\n<p><img src=\"starharbor_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"starharbor_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"starharbor_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"starharbor_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>34. Strange Hunt</strong></p>\n<p><img src=\"strangehunt_splash.jpg\" width=\"100\" height=\"110\"> <img src=\"strangehunt_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"strangehunt_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"strangehunt_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>35. Tasty dish</strong></p>\n<p><img src=\"tastydish_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"tastydish_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"tastydish_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"tastydish_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>36. Vineyard</strong></p>\n<p><img src=\"vineyard_splash.jpg\" width=\"100\" height=\"110\"> <img src=\"vineyard_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"vineyard_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"vineyard_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>37. Waterway</strong></p>\n<p><img src=\"waterway_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"waterway_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"waterway_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"waterway_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>38. Wild balls</strong></p>\n<p><img src=\"wildballs_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"wildballs_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"wildballs_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"wildballs_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>39. Wild road</strong></p>\n<p><img src=\"wildroad_splash.jpg\" width=\"100\" height=\"110\"> <img src=\"wildroad_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"wildroad_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"wildroad_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>40. Copter bomber</strong></p>\n<p><img src=\"copterbomber_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"copterbomber_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"copterbomber_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"copterbomber_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>41. Drunkman</strong></p>\n<p><img src=\"drunkman_splash.jpg\" width=\"100\" height=\"99\"> <img src=\"drunkman_scr1.gif\" width=\"173\" height=\"179\"> <img src=\"drunkman_scr2.gif\" width=\"173\" height=\"178\"> <img src=\"drunkman_scr3.gif\" width=\"173\" height=\"178\"></p>\n<p>-----------------------------</p>\n<p><strong>42. Fisher</strong></p>\n<p><img src=\"fisher_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"fisher_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"fisher_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"fisher_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>43. Air boil</strong></p>\n<p><img src=\"airboil_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"airboil_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"airboil_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"airboil_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>&nbsp;</p>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/index.htm",
    "content": "<html>\n<head>\n<script language=\"JavaScript\"> \n<!-- \nwindow.location.href = \"./rus/menu1_news.htm\"\n// --> \n</script>\n\n<title>ColdCore� official site</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\"></head>\n\n<body bgcolor=\"#FFFFFF\">\n<table width=\"100%%\" height=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n  <tr>\n    <td align=\"center\" valign=\"middle\"> \n      <table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n        <tr>\n    <td><div align=\"center\"><a href=\"./rus/menu1_news.htm\"><img src=\"cc.gif\" width=\"55\" height=\"42\" border=\"0\"></a></div></td>\n  </tr>\n  <tr>\n    <td><div align=\"center\"><strong><font color=\"#0099CC\">Cold Core�</font></strong></div></td>\n  </tr>\n</table>\t\n\t</td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/loadpages/muzon_AirBoil.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n<HTML><HEAD><TITLE>Java-����: Air Boil</TITLE>\n<META http-equiv=Content-Type content=\"text/html; charset=windows-1251\"><LINK \nhref=\"Java-���� Star Harbor_files/style.css\" type=text/css rel=stylesheet>\n<META content=\"MSHTML 6.00.2800.1505\" name=GENERATOR></HEAD>\n<BODY>\n<TABLE height=\"100%\" cellSpacing=10 cellPadding=0 width=\"100%\" align=center \nborder=0 valign=\"top\">\n  <TBODY>\n  <TR>\n    <TD vAlign=top align=middle width=120><B>Air Boil<BR></B><BR>\n      <HR color=#eeeeee noShade>\n      <IMG src=\"../games/airboil_scr3.gif\"> \n      <HR color=#eeeeee noShade>\n      <FONT color=#ffffff size=+1>���</FONT><BR><FONT color=red \n      size=+1>5008485</FONT> </TD>\n    <TD vAlign=top align=left><FONT size=+1>��� ��������?</FONT> <BR>\n      <P>\n      <P>�������� ����� SMS-���������.</P>\n      <P>� ������ ��������� ������� <B>5008485</B></P>\n      <P>��������� SMS-��������� � ����� �� ��������� ����� ������ \n���������:<BR>\n      <TABLE borderColor=#000000 cellSpacing=0 cellPadding=4 border=1 noshade \n      table>\n        <TBODY>\n        <TR>\n          <TD width=151 height=40>��������</TD>\n          <TD>������ � �������</TD>\n          <TD>��������� �����</TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>������-�����</TD>\n          <TD align=middle><FONT color=red size=+1>9998</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>��������, �������, ������, �����, ��������, ������, ������, \n            ������ ��������, �����������, ��������, �����, �����, ������, \n            �������, ��������, ������, �����, ����, ������, ���������, \n          ���������</TD>\n          <TD align=middle><FONT color=red size=+1>9998</FONT></TD></TR></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mega_logo.gif\" width=151></TD><!-- -->\n          <TD>������-�����</TD>\n          <TD align=middle><FONT color=red size=+1>9998</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/bee_logo.gif\" width=64></TD><!-- -->\n          <TD>������ � ���������� �������, ������, ��������, �������, ������, \n            ��������, ������, ��������, �����, ����, ���������, ��������, \n            �������, �����, ������, ����, ������, �����-���������, �������� \n            ������ ��������, �������, ���, ���������, ������, ���������, ������, \n            �����, ������-���, ������� ���������, ���������, ���������, ������ \n            �� ����, ������ �������, �������, ��������� �����������, �������, \n            ��������, ����������, ��������, ����, �����, �����-������� \n            ������������, ���������, ������ </TD>\n          <TD align=middle><FONT color=red \n      size=+1>9998</FONT></TD></TR></TBODY></TABLE></P>\n      <P class=small>��������� �������� SMS-��������� �� ��������� ����� \n      ��������� ���������� $2,50 ��� ����� �������. </P>\n      <P>����� ��������� ������ �� �������� WAP-������,<BR>������� ���������� \n      ��������������<BR>(�������� ���������� � ������ ��������).</P>\n      <P>�������������� ��������:<BR><B>Motorola: C380, C650, v220, v180, v300, \n      v500, v600, v535, v550, v620, E398, E375, v3<BR>Nokia: 3510i, 7210, \n      3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, \n      6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i, 6230, 5140, 5140, \n      6170, 6255, 6020, 7260, 7270, 3650, 3600, 3620, 3660, 7650, N-Gage, \n      N-GageQD, 7610, 6260, 6670, 3230<BR>Samsung: C100, C108T, C110, S300, \n      S300M, S307, E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, \n      E820, X460, X468, X100, X108, X600, X608<BR>Siemens: M55, C60, MC60, S55, SL55, S65, CX65, \n      CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65, C65, \n      SL65<BR>LG: G1600<BR>Sony Ericsson: T610, T616, T618, T628, T630, T637, \n      Z600, Z608<BR></B><BR></P>\n      <P></P></TD></TR></TBODY></TABLE>\n<HR color=#666666 noShade>\n</BODY></HTML>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/loadpages/muzon_StarHarbor.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n<!-- saved from url=(0056)http://www.muzon.ru/game_preview.jsp?cat=all&type=p&id=1 -->\n<HTML><HEAD><TITLE>Java-����: Star Harbor</TITLE>\n<META http-equiv=Content-Type content=\"text/html; charset=windows-1251\"><LINK \nhref=\"Java-���� Star Harbor_files/style.css\" type=text/css rel=stylesheet>\n<META content=\"MSHTML 6.00.2800.1505\" name=GENERATOR></HEAD>\n<BODY>\n<TABLE height=\"100%\" cellSpacing=10 cellPadding=0 width=\"100%\" align=center \nborder=0 valign=\"top\">\n  <TBODY>\n  <TR>\n    <TD vAlign=top align=middle width=120><B>Star Harbor<BR></B><BR>\n      <HR color=#eeeeee noShade>\n      <IMG src=\"../games/starharbor_scr3.gif\"> \n      <HR color=#eeeeee noShade>\n      <FONT color=#ffffff size=+1>���</FONT><BR><FONT color=red \n      size=+1>5006971</FONT> </TD>\n    <TD vAlign=top align=left><FONT size=+1>��� ��������?</FONT> <BR>\n      <P>\n      <P>�������� ����� SMS-���������.</P>\n      <P>� ������ ��������� ������� <B>5006971</B></P>\n      <P>��������� SMS-��������� � ����� �� ��������� ����� ������ \n���������:<BR>\n      <TABLE borderColor=#000000 cellSpacing=0 cellPadding=4 border=1 noshade \n      table>\n        <TBODY>\n        <TR>\n          <TD width=151 height=40>��������</TD>\n          <TD>������ � �������</TD>\n          <TD>��������� �����</TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>������-�����</TD>\n          <TD align=middle><FONT color=red size=+1>4012</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>��������, �������, ������, �����, ��������, ������, ������, \n            ������ ��������, �����������, ��������, �����, �����, ������, \n            �������, ��������, ������, �����, ����, ������, ���������, \n          ���������</TD>\n          <TD align=middle><FONT color=red size=+1>4012</FONT></TD></TR></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mega_logo.gif\" width=151></TD><!-- -->\n          <TD>������-�����</TD>\n          <TD align=middle><FONT color=red size=+1>4012</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/bee_logo.gif\" width=64></TD><!-- -->\n          <TD>������ � ���������� �������, ������, ��������, �������, ������, \n            ��������, ������, ��������, �����, ����, ���������, ��������, \n            �������, �����, ������, ����, ������, �����-���������, �������� \n            ������ ��������, �������, ���, ���������, ������, ���������, ������, \n            �����, ������-���, ������� ���������, ���������, ���������, ������ \n            �� ����, ������ �������, �������, ��������� �����������, �������, \n            ��������, ����������, ��������, ����, �����, �����-������� \n            ������������, ���������, ������ </TD>\n          <TD align=middle><FONT color=red \n      size=+1>4012</FONT></TD></TR></TBODY></TABLE></P>\n      <P class=small>��������� �������� SMS-��������� �� ��������� ����� \n      ��������� ���������� $2,50 ��� ����� �������. </P>\n      <P>����� ��������� ������ �� �������� WAP-������,<BR>������� ���������� \n      ��������������<BR>(�������� ���������� � ������ ��������).</P>\n      <P>�������������� ��������:<BR><B>Motorola: C380, C650, v220, v180, v300, \n      v500, v600, v535, v550, v620, E398, E375, v3<BR>Nokia: 3410, 3510i, 7210, \n      3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, \n      6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i, 6230, 5140, 5140, \n      6170, 6255, 6020, 7260, 7270, 3650, 3600, 3620, 3660, 7650, N-Gage, \n      N-GageQD, 7610, 6260, 6670, 3230<BR>Samsung: C100, C108T, C110, S300, \n      S300M, S307, E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, \n      E820, X460, X468, X100, X108, X600, X608<BR>Siemens: M(T)50, C55, C56, \n      CT56, 6688i, M46, 3118, SL45i, M55, C60, MC60, S55, SL55, S65, CX65, \n      CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65, C65, \n      SL65<BR>LG: G1600<BR>Sony Ericsson: T610, T616, T618, T628, T630, T637, \n      Z600, Z608<BR></B><BR></P>\n      <P></P></TD></TR></TBODY></TABLE>\n<HR color=#666666 noShade>\n</BODY></HTML>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_airaggression.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/AIR AGGRESSION</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/airaggression_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">AIR AGGRESSION<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airaggression_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airaggression_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airaggression_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>У землян очередная напасть — 8 инопланетных монстров захватили власть над всеми самолетами планеты и только ваш самолет чудом избежал их влияния. Ваша задача уничтожить всех восьмерых монстров, принявших образы гигантских самолетов, и вернуть планете мир и спокойствие. Управляя маленьким самолетиком на экране, следует избегать столкновения с другими самолетами, избегать попаданий и брать бонусы и оружие, которое доставляется вертолетом поддержки. </div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"AIR AGGRESSION(airaggression)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">\n<img src=\"../logos/playmobile.gif\" border=\"0\" alt=\"3$\">\n</a>\n<a href=\"http://www.888x.ru/javagames/show.php?ng=2057&actnum=1&md=76\" target=\"_new\">\n<img src=\"../logos/nikita.gif\" border=\"0\" alt=\"3$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_airboil.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/AIR BOIL</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/airboil_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">AIR BOIL<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airboil_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airboil_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/airboil_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>В 2050 году, была обнаружена отдаленная планета с очень низкой гравитацией. Жители этой планеты оказались порабощены четырьмя огромными машиноподобными пришельцами. Демократическая Земля не смогла смириться с таким состояниейм дел и космический шаттл доставил на эту планету суперспецназовца Джона Петрова, который и был сброшен на поверхность планеты вместе с велосипедом и ракетной установкой для наведения демократии и мостов дружбы. Итак, задача играющего - пройти 20 уровней уничтожая различную летающую нечисть и уклоняясь от метеоритных дождей, весьма частых на этой планете. Игровые попытки можно пополнять, подбирая падающие пропеллеры, а патроны прилетают на воздушных шарах.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"AIR BOIL(airboil)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.infon.ru/games.phtml?gid=468360\" target=\"_new\">\n<img src=\"../logos/infon.gif\" border=\"0\" alt=\"2.5$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_aneks_ny2006.htm",
    "content": "\n\n\n\n\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/The collection 'New Year's jokes'</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/aneks_ny2006_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">6230i, 8800</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">6600, 6620</div>\n<div class=\"devicelist\">6630</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">D108, S100, S105, X400, X426, X427, X430</div>\n<div class=\"devicelist\">E400, S200, S208</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<div class=\"devicelist\">E105, E315, E316, E317, E710, E715, P400, P510, P518, X427M, X450, X458, X475</div>\n<div class=\"devicelist\">E217, E335, E635, X640</div>\n<div class=\"devicelist\">C200, C207, C208, C225, E600, E608, X105</div>\n<div class=\"devicelist\">D410, D415, D418, P207, P777</div>\n<div class=\"devicelist\">E300, E310, E810, X480</div>\n<div class=\"devicelist\">X120, X140</div>\n<div class=\"devicelist\">E610, E618, P730, P735</div>\n<div class=\"devicelist\">D500, D508, E730</div>\n<div class=\"devicelist\">E530, E620, E720, E880</div>\n<div class=\"devicelist\">D600</div>\n<div class=\"devicelist\">Z105, Z107</div>\n<div class=\"devicelist\">Z110</div>\n<div class=\"devicelist\">Z130</div>\n<div class=\"devicelist\">Z140, Z300, Z500</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">The collection 'New Year's jokes'<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/aneks_ny2006_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/aneks_ny2006_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/aneks_ny2006_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Приложение является сборником новогодних анекдотов, рассортированных по темам. В сборник вошло 60 анекдотов.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"The collection 'New Year's jokes'(aneks_ny2006)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.infon.ru/games.phtml?gid=468361\" target=\"_new\">\n<img src=\"../logos/infon.gif\" border=\"0\" alt=\"2.5$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_blazinggears.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/BLAZING GEARS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/blazinggears_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">BLAZING GEARS<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/blazinggears_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/blazinggears_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/blazinggears_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Вы водитель автомашины, участвующей в гонках без правил. На прохождение каждого этапа гонок вам дается ограниченное время. Двигайтесь на максимальной скорости, но постарайтесь не сталкиваться с другими машинами!</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"BLAZING GEARS(blazinggears)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_caspianmonster.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/CASPIAN MONSTER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/caspianmonster_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">CASPIAN MONSTER<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/caspianmonster_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/caspianmonster_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/caspianmonster_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Террористы похитили секретный экраноплан «Каспийский монстр», вооруженный самым современным оружием, но вам удалось проникнуть на их базу и угнать экраноплан. Ваша задача пройти три участка от базы к открытому морю, нашпигованных вражеской техникой и минами.Вооружение состоит из автоматической пушки и двух видов ракет, самонаводящихся и неуправляемых. Самонаводящиеся ракеты автоматически выбирают цель и рассчитывают свою траекторию, а неуправляемые летят по курсу экраноплана и очень полезны для разрушения мостов.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"CASPIAN MONSTER(caspianmonster)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">\n<img src=\"../logos/playmobile.gif\" border=\"0\" alt=\"2$\">\n</a>\n<a href=\"http://www.888x.ru/javagames/show.php?ng=2058&actnum=1&md=76\" target=\"_new\">\n<img src=\"../logos/nikita.gif\" border=\"0\" alt=\"3$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_castleassault.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/CASTLE ASSAULT</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/castleassault_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">CASTLE ASSAULT<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/castleassault_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/castleassault_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/castleassault_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Вы управляете катапультой и должны разрушить два соседних участка стены осажденного замка. Дождитесь зарядки катапульты и следите за указателем высоты прицеливания. Стену можно разрушить только сверху вниз. Но берегитесь вражеских камней летящих из-за стены!</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"CASTLE ASSAULT(castleassault)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_cockroach.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/COCKROACH</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/cockroach_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">COCKROACH<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/cockroach_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/cockroach_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/cockroach_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок  управляет тараканом, ползающим в лабиринте из труб и его задача найти выход из лабиринта. В лабиринте разбросаны различные съедобные предметы, некоторые таракан может есть безболезненно, некоторые отнимают очки и время.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"COCKROACH(cockroach)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_coconutsfall.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/COCONUTS FALL</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/coconutsfall_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">COCONUTS FALL<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/coconutsfall_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/coconutsfall_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/coconutsfall_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок управляет обезьяной, спасающейся на верхушках пальм от карабкающихся по ним человечков. Обезьяна может бросать в человечков собранные на пальмах кокосы и должна прятаться от пролетающего над пальмами вертолета.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"COCONUTS FALL(coconutsfall)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_conecone.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/CONE! CONE!</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/conecone_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">CONE! CONE!<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/conecone_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/conecone_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/conecone_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок управляет белкой, защищающей от ворон спрятанные в дуплах дерева запасы. Белка прыгает по ветвям, собирает шишки и бросает их по воронам, садящимся на ветви.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"CONE! CONE!(conecone)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_copterbomber.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/COPTER BOMBER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/copterbomber_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">COPTER BOMBER<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/copterbomber_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/copterbomber_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/copterbomber_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Вы пилот секретного вертолета-бомбардировщика, уничтожьте все вражеские цели и не сталкивайтесь с воздушным противником.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"COPTER BOMBER(copterbomber)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_drunkman.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/TIPPLER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/drunkman_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">TIPPLER<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/drunkman_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/drunkman_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/drunkman_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Мобильная версия карточной игры ПЬЯНИЦА. Игра на раздевание с тремя противниками.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"TIPPLER(drunkman)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_firingline.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/FIRING LINE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/firingline_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">FIRING LINE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/firingline_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/firingline_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/firingline_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок - защитник стыковочного шлюза, в который лезут инопланетные твари. Задача - настрелять как можно больше тварей, прежде чем их поток захлестнет станцию.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"FIRING LINE(firingline)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_fisher.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/FISHER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/fisher_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">FISHER<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fisher_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fisher_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fisher_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок выступает в роли рыбака и его задача наловить как можно больше рыбы при ограниченном количестве крючков (игровых попыток). В воде плавают рыбы, которых можно ловить и хищники, которые могут перекусывать леску, при этом игрок теряет одну попытку. Игрок может управлять глубиной погружения крючка, разматывая леску или поднимая удочку.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"FISHER(fisher)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_fruitmania.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/FRUITMANIA</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/fruitmania_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.cellcasino.ru\" target=\"_new\" class=\"gameinfoheadermin\">CellCasino</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">FRUITMANIA<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fruitmania_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fruitmania_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/fruitmania_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Мобильная версия известного автомата \"Однорукий бандит\", позволяющая делать ставку с реального счета в казино и осуществлять игру через интернет с мобильного телефона, выигрывая реальные деньги.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"FRUITMANIA(fruitmania)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_hardday.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/HARD DAY</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/hardday_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">HARD DAY<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hardday_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hardday_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hardday_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Вы управляете курьером, который должен доставлять документы внутри офиса. Все белые папки должны быть доставлены нетерпеливым получателям как можно быстрее. Помните, ваш директор будет очень зол, если встретит вас шатающимся без дела!</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"HARD DAY(hardday)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_hunt.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/HUNT</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/hunt_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">HUNT<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hunt_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hunt_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/hunt_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок выступает в роли охотника и  в начале игры ему дается 20 патронов. Он должен настрелять как можно больше животных. При пропуске без единого выстрела 20 животных, у игрока снимается один патрон. Частота появления зверей на экране возрастает с течением игрового процесса. За каждое убитое животное, игроку начисляется определенное количество игровых очков. При наведении прицела на бегущее животное, оно останавливается (кроме вороны) и отрабатывается анимация страха, животное стоит под прицелом, пока игрок не выстрелит или не уберет прицел.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"HUNT(hunt)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_icegifts.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/ICE GIFTS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/icegifts_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">ICE GIFTS<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/icegifts_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/icegifts_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/icegifts_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Помоги деду Морозу отправить все Новогодние подарки. Совмещай их одинаковыми сторонами и не допускай отсутствия пустых прорубей для новых подарков.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"ICE GIFTS(icegifts)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_ironstream.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/IRON STREAM</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/ironstream_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">IRON STREAM<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ironstream_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ironstream_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ironstream_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Внимание! Внимание! Враг прорвал нашу оборону и входит в населенный район! Ваш танк единственная наша надежда в этом районе и Ваша святая обязанность защитить его. Вы должны уничтожить, как можно больше вражеских танков, но при этом сохранить в целости постройки.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"IRON STREAM(ironstream)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_kalah.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/KALAH</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/kalah_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">KALAH<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kalah_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kalah_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kalah_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Мобильная версия известной логической игры Kalah. Задача игрока собрать как можно больше камней в свой калах (правая ложбинка на игровом поле). При очередном ходе играющий снимает с одного из своих полей все камни и распределяет их по одному на последующие поля в порядке возрастания их номеров; полем, следующим за шестым, считается свой калах. Далее камни распределяются по чужим полям (опять-таки в порядке возрастания их номеров), затем вновь по своим (чужой калах пропускается) и так далее, как бы совершая обход полей против часовой стрелки. Если последний из распределяемых камней попал в «свой» калах, то игрок делает еще один ход. Во всех остальных случаях очередь хода передается противнику. Если последний камень попал на пустое поле игрока, совершавшего ход, а на противоположном поле соперника есть хотя бы один камень, то содержимое обоих полей переносится в КАЛАХ игрока, совершавшего ход (после чего, ход переходит к его противнику). Если на полях игрока, сделавшего ход, не остается ни одного камня, то все камни, находящиеся на полях противника, переносятся в калах противника, и игра заканчивается. Игра заканчивается, когда одному из противников нечем ходить. Выигрывает тот, у кого по окончании игры в калахе оказалось больше камней. Если в обоих калахах находится по 36 камней, фиксируется ничья.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"KALAH(kalah)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">\n<img src=\"../logos/playmobile.gif\" border=\"0\" alt=\"3$\">\n</a>\n<a href=\"http://www.888x.ru/javagames/show.php?ng=2059&actnum=1&md=76\" target=\"_new\">\n<img src=\"../logos/nikita.gif\" border=\"0\" alt=\"3$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_kickkick.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/KICK! KICK!</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/kickkick_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">KICK! KICK!<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kickkick_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kickkick_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/kickkick_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игра по мотивам настольной игры. Игрок управляет тремя футболистами, закрепленными на одном вращающемся стержне.  Необходимо пробить защиту соперника и забить мяч в его ворота.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"KICK! KICK!(kickkick)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_lifesaver.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/LIFESAVER</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/lifesaver_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">LIFESAVER<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/lifesaver_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/lifesaver_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/lifesaver_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок выступает в роли руководителя пожарной команды и его задача спасти как можно больше жителей из горящего дома. Изначально горит первый этаж дома, с течением времени огонь охватывает следующие этажи здания, управляя пожарниками, игрок может тушить этажи, исключая первый. С последнего этажа прыгают люди и игрок должен, управляя пожарными, успевать ловить их на брезент. При смерти одного прыгнувшего, снимается одна попытка играющего, так же попытка снимается при полном сгорании здания.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"LIFESAVER(lifesaver)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_livebridge.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/LIVE BRIDGE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/livebridge_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">LIVE BRIDGE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/livebridge_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/livebridge_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/livebridge_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок управляет носильщиком, переправляющим через реку грузы. Через реку можно переправиться только по плавающим в ней черепахам, ныряющим время от времени за рыбками, всплывающими со дна.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"LIVE BRIDGE(livebridge)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_mobilechase.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/MOBILE CHASE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mobilechase_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">MOBILE CHASE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilechase_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilechase_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilechase_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок должен нагнать фургон преступников и стреляя в него, заставить его остановиться. При этом надо объезжать препятствия на дороге и избегать столкновения с другими участниками дорожного движения. Так же следует избегать луж, так как они делают автомобиль неуправляемым. </div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"MOBILE CHASE(mobilechase)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">\n<img src=\"../logos/playmobile.gif\" border=\"0\" alt=\"3$\">\n</a>\n<a href=\"http://www.888x.ru/javagames/show.php?ng=2060&actnum=1&md=76\" target=\"_new\">\n<img src=\"../logos/nikita.gif\" border=\"0\" alt=\"3$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_mobilesheriff.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/MOBILE SHERIFF</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mobilesheriff_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">MOBILE SHERIFF<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilesheriff_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilesheriff_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mobilesheriff_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок управляет шерифом, освобождающим маленький техасский город от банды. Число бандитов известно, но в лицо их никто не знает. Игрок должен отличить бандитов от мирных горожан и уничтожить бандитов. В проемах окон и дверей периодически появляются и прячутся человечки. Человечки могут быть мирными горожанами или бандитами. Бандит внешне отличается только тем, что начинает стрелять в шерифа. Игрок может стрелять первым, рискуя убить горожанина или ждать пока по нему не начнут стрелять бандиты. Бандит делает разное число выстрелов, но убить шерифа может только третьим выстрелом подряд. Игрок должен успеть за это время прицелиться и выстрелить. Убив мирного горожанина, игрок теряет одну игровую попытку. Убив бандита, игрок получает очки.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"MOBILE SHERIFF(mobilesheriff)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_mtvpaparazzo.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/PAPARAZZO</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mtvpaparazzo_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.mtv.ru\" target=\"_new\" class=\"gameinfoheadermin\">MTV</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">PAPARAZZO<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpaparazzo_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpaparazzo_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpaparazzo_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Вы должны фотографировать лица знаменитостей шоу-бизнеса,имеющих знак 'звезды' и избегать охранников в окнах. Ваше время и число кадров-ограничены.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"PAPARAZZO(mtvpaparazzo)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_mtvpillow.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/PILLOW</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mtvpillow_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.mtv.ru\" target=\"_new\" class=\"gameinfoheadermin\">MTV</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">PILLOW<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpillow_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpillow_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpillow_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Ты ходишь по офису MTV и дубасишь всех подушкой.Опасайся охранников с дубинками.Заходи в двери,там могут быть подушки.Лови сердца-это жизни.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"PILLOW(mtvpillow)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_mtvpuzzle.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/MTV PUZZLE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mtvpuzzle_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.mtv.ru\" target=\"_new\" class=\"gameinfoheadermin\">MTV</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">MTV PUZZLE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpuzzle_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpuzzle_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvpuzzle_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Ваша задача-передвигая квадратики,собрать изначальную картинку за минимальное количество ходов. Имеется три уровня сложности поля: 3х3,4х4 и 5х5.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"MTV PUZZLE(mtvpuzzle)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_mtvstage.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/HOLD OUT ON THE STAGE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/mtvstage_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.mtv.ru\" target=\"_new\" class=\"gameinfoheadermin\">MTV</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">HOLD OUT ON THE STAGE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvstage_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvstage_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/mtvstage_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Вы должны продержаться на сцене определенное время,уворачиваясь от града опасных предметов,летящих из зала.Ловите только цветы ваших фанатов и зарабатывайте этим очки.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"HOLD OUT ON THE STAGE(mtvstage)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_nimble.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/NIMBLE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/nimble_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">NIMBLE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/nimble_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/nimble_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/nimble_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок управляет рабочим  в аэропорту, который должен разобрать перепутанный багаж на лентах транспортера до того как транспортеры переполнятся.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"NIMBLE(nimble)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_opthunderclap.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/OPERATION THUNDERCLAP</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/opthunderclap_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">OPERATION THUNDERCLAP<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/opthunderclap_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/opthunderclap_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/opthunderclap_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок выступает в роли пилота боевого вертолета, в задачу которого входит уничтожение как можно большего количества вертолетов противника. Вертолеты противника случайным образом появляются на экране и перемещаются по различным траекториям. Уничтожение вертолета противника осуществляется путем наведения на него прицела и нажатия на гашетку (кнопка «Огонь»). Некоторые противники так же могут вести огонь по игроку, вертолет игрока уничтожается, если стреляющий противник не будет своевременно уничтожен. За каждого уничтоженного противника начисляются 10 игровых очков.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"OPERATION THUNDERCLAP(opthunderclap)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_oysterbank.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/OYSTER BANK</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/oysterbank_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">OYSTER BANK<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/oysterbank_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/oysterbank_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/oysterbank_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок управляет ныряльщиком, охотящимся за жемчужинами на морском дне. Игрок должен направлять ловца к тем раковинам, которые открыты, следить за его запасом кислорода и беречь от акул</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"OYSTER BANK(oysterbank)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_papaninsquest.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/PAPANIN'S QUEST</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/papaninsquest_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">PAPANIN'S QUEST<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/papaninsquest_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/papaninsquest_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/papaninsquest_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Путешественник Папанин обнаружил египетскую пирамиду, затерянную во льдах Антарктики. При осмотре он провалился в расщелину и оказался внутри. Задача игрока — помочь Папанину выбраться наружу, преодолев 10 игровых уровней. Чтобы пройти игровой уровень, требуется собрать все бриллианты, расположенные в лабиринте, после чего появляется ключ, которым можно открыть дверь на следующий уровень. В прохождении лабиринтов, игроку мешают различного вида монстры, с которыми игрок может бороться при помощи мечей, разбросанных по уровню. Жизни можно восстановить при помощи кувшина с водой, а некоторые участки пола можно пробивать при помощи кирки.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"PAPANIN'S QUEST(papaninsquest)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">\n<img src=\"../logos/playmobile.gif\" border=\"0\" alt=\"2$\">\n</a>\n<a href=\"http://www.888x.ru/javagames/show.php?ng=2061&actnum=1&md=76\" target=\"_new\">\n<img src=\"../logos/nikita.gif\" border=\"0\" alt=\"3\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_ravenscheese.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/RAVEN'S CHEESE</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/ravenscheese_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">RAVEN'S CHEESE<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ravenscheese_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ravenscheese_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/ravenscheese_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок выступает в роли лисы, ловящей куски сыра, бросаемого воронами. Задача игрока наловить как можно больше кусков сыра. Игра не имеет ограничения по времени, но имеет ограничение по максимальному количеству пропущенных сыров. На ветвях деревьев появляются вороны с сыром в клюве, игрок должен угадать момент броска сыра и поставить лису в позицию, при которой сыр будет брошен ей в пасть. Всего имеется четыре положения лисы. Игроку следует учитывать, что лиса не может постоянно стоять на задних лапах и через какое то время опускается.  Если ворона доходит до края ветки, а лиса не готова поймать сыр, то раздается карканье и сыр падает на землю. С края экрана выбегает мышь и уносит кусок сыра, при этом у игрока забирается одна попытка. Скорость появления ворон со временем увеличивается, но при достижении игроком количества очков кратного 50, количество  попыток игрока восстанавливается.  Выигрышная картинка будет показана игроку при набранном количестве сыров не меньше 100. При достижении количества очков кратного 50, скорость появления ворон уменьшается.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"RAVEN'S CHEESE(ravenscheese)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_searoad.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/SEA ROAD</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/searoad_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">SEA ROAD<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searoad_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searoad_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searoad_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок управляет спортивным катером, принимающим участие в слаломе на оживленном морском пути. Двигаясь по дистанции, игрок должен проходить через встречные ворота, время прохождения которых влияет на зарабатываемые очки.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"SEA ROAD(searoad)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_searovers.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/SEA ROVERS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/searovers_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">SEA ROVERS<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searovers_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searovers_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/searovers_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок управляет пиратским парусным кораблем и  должен захватывать торговые корабли, избегая встречи с военными кораблями. Все корабли вооружены и делятся на торговые, военные и прочие (боты). Корабли отличаются также количеством энергии и, соответственно, числом бортовых залпов, необходимых для их потопления. Игрок должен нападать на торговые корабли и опасаться военных, которые могут дать отпор. Прочие корабли  также могут быть мишенью для пушек пиратского корабля, но это не принесет игроку много очков.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"SEA ROVERS(searovers)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_slider_alpop.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/Slider 'Aleosha Popovich'</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/slider_alpop_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">6230i, 8800</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">Slider 'Aleosha Popovich'<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/slider_alpop_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/slider_alpop_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/slider_alpop_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Слайдер содержит 10 кадров мультфильма с текстом к каждому кадру. Есть возможность просмотра кадров как в ручном так и в автоматическом режиме. Можно увеличивать выбранный кадр и рассматривать отдельные детали изображения.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"Slider 'Aleosha Popovich'(slider_alpop)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_smashingkick.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/SMASHING KICK</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/smashingkick_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">SMASHING KICK<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smashingkick_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smashingkick_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smashingkick_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок  управляет тренирующимся футболистом и его задача довести как можно больше мячей до ворот, не роняя их на землю. Тренер с уменьшающимся интервалом подает мячи и игрок, удерживая мяч в воздухе при помощи ног и головы, доводит его до ворот и забивает, попытка снимается если мяч касается земли.  После 10 забитых мячей игроку восстанавливается 1 игровая попытка.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"SMASHING KICK(smashingkick)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_smscat.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/SMS Catalog</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/smscat_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3410</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">6230i, 8800</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M(T)50, C55, C56, CT56, 6688i, M46, 3118</div>\n<div class=\"devicelist\">SL45i</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">SMS Catalog<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smscat_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smscat_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/smscat_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Мобильный каталог контента, позволяющий пользователю ознакомиться с составом мобильного контента в базе контент провайдера и, если телефон имеет возможность, осуществить отправку SMS на номер провайдера с целью заказа понравившегося контента. Приложение позволяет организовывать сложную древовидную структуру каталога с включением изображений для предпросмотра, изображения могут храниться как с каталогом так и быть загруженными через сеть. Поддерживается три схемы отправки SMS: Siemens, WMA и Samsung. Язык приложения русский, при ином языке, установленном на аппарате пользователя, приложение автоматически отображает текст транслитом. Приложение динамически подстраивается под возможности аппарата и может работать на любом аппарате с платформой не ниже MIDP-1.0. Список возможностей оболочки превышает 20 пунктов.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"SMS Catalog(smscat)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_spiders.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/SPIDERS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/spiders_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">SPIDERS<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/spiders_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/spiders_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/spiders_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок управляет муравьем, который должен носить в муравейник веточки из лежащей невдалеке кучи и не стать добычей пауков, спускающихся сверху на паутине. Игрок может перемещать муравья влево/вправо. Подбежав к куче веточек, муравей взваливает одну себе на спину. Вернувшись к муравейнику, он бросает свой груз в проем и бежит за следующим. За каждую доставленную веточку игроку начисляются очки. Между муравейником и кучей веток висят на своих паутинах пауки, поджидающие добычу. Пауки быстро опускаются и медленно поднимаются по паутине. Кроме того, они передвигаются с остановками, иногда меняя после такой паузы направление движения. Если паук схватит муравья, то игрок теряет одну игровую попытку.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"SPIDERS(spiders)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_starharbor.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/STAR HARBOR</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/starharbor_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.coldcore.ru\" target=\"_new\" class=\"gameinfoheadermin\">ColdCore(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2005</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3410</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M(T)50, C55, C56, CT56, 6688i, M46, 3118</div>\n<div class=\"devicelist\">SL45i</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">STAR HARBOR<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/starharbor_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/starharbor_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/starharbor_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>В очередной раз гадкие инопланетяне собираются попрать своими щупальцами нашу голубую планету, но они не учли того, что ,несмотря на все усилия по уклонению от воинской повинности, любитель компьютерных игр Иван Копченый был забрит в космический флот и находился среди ноющих о родном доме призывников на борту космического крейсера \"Червона Украина\", готовящегося к отправлению на границы солнечной системы с орбиты Земли. Неожиданное нападение пришельцев так поразило командный состав крейсера, что оно немедленно ушло в запой лечить нервы и Иван остался единственным дееспособным членом экипажа. Итак, задача игрока отразить нападение, путем тотального уничтожения атакующих сил. Игра от первого лица из разряда \"Убей их всех\", имеет три уровня сложности, различающиеся активностью и количеством противника. </div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"STAR HARBOR(starharbor)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<a href=\"http://www.infon.ru/games.phtml?gid=468366\" target=\"_new\">\n<img src=\"../logos/infon.gif\" border=\"0\" alt=\"2.5$\">\n</a>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_strangehunt.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/STRANGE HUNT</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/strangehunt_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">STRANGE HUNT<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/strangehunt_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/strangehunt_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/strangehunt_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Тебя занесло на военный полигон, но не сдавайся! Несмотря на трудности, настреляй как можно больше уток и кабанов!</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"STRANGE HUNT(strangehunt)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_tastydish.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/TASTY DISH</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/tastydish_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">TASTY DISH<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/tastydish_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/tastydish_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/tastydish_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок управляет крокодилом, охотящимся в реке у берега. Крокодил должен поймать свою добычу и не попасть на мушку охотника. Крокодил движется к берегу, пересекая реку, с постоянной скоростью. Игрок может только поворачивать крокодила влево/вправо, выбирая на какой участок берега напасть. Подплыв к берегу, крокодил хватает добычу, если на этом участке есть какое-либо животное, пьющее воду из реки. Игроку начисляются очки, в зависимости от ценности добычи. На месте животного может оказаться охотник, который, появившись на берегу, стреляет в крокодила, если тот находится напротив него. В этом случае крокодил погибает, а игрок теряет игровую попытку. Если на участке берега, к которому был направлен крокодил, нет добычи, то крокодил остается ни с чем и погружается обратно в воду. Для следующей попытки придется снова переплывать реку, подкрадываясь издалека. Игрок может промахнуться только 20 раз, после чего он теряет игровую попытку.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"TASTY DISH(tastydish)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_vineyard.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/VINEYARD</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/vineyard_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">VINEYARD<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/vineyard_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/vineyard_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/vineyard_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Собирайте виноград и раскладывайте его в корзины, переход на следующий уровень когда все корзины заполнены. Не попадайтесь улиткам!</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"VINEYARD(vineyard)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_waterway.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/WATER WAY</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/waterway_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">WATER WAY<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/waterway_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/waterway_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/waterway_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Вы управляете муравьем, собирающим воду для муравейников. Ваша задача ловить по одной капле воды в листок и выливать ее в цветок вашего напарника-муравья. Листок может выдержать только одну каплю!</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"WATER WAY(waterway)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_wildballs.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/WILD BALLS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/wildballs_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://ru.samsungmobile.com\" target=\"_new\" class=\"gameinfoheadermin\">SAMSUNG FunClub</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2004</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">WILD BALLS<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildballs_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildballs_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildballs_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Игрок  осуществляет игру в футуристические кегли и его задача выбить как  можно больше кеглей, зарабатывая очки при ограниченном количестве шаров. Но кегли нельзя сбивать напрямую своим шаром, поэтому периодически случайным образом, экран пересекают шары, которые игрок должен направить на кегли, посредством удара своим шаром и изменения траектории катящегося шара. Если игрок промахнется мимо катящегося шара, то его шар разобьется о поднявшуюся стенку и одна игровая попытка будет снята.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"WILD BALLS(wildballs)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/gpage_wildroad.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)/WILD ROAD</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"../games/wildroad_splash.jpg\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n        <div><a href=\"http://www.ringtime.ru\" target=\"_new\" class=\"gameinfoheadermin\">Ringtime(R)</a></div>\n         <br>\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n         <div><strong>2006</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n        <hr align=\"center\" noshade>\n\n<div class=\"devicename\">Nokia</div>\n<div class=\"devicelist\">3510i</div>\n<div class=\"devicelist\">7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</div>\n<div class=\"devicelist\">6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</div>\n<div class=\"devicelist\">3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</div>\n<div class=\"devicelist\">7610, 6260, 6670, 3230</div>\n<br>\n<div class=\"devicename\">Siemens</div>\n<div class=\"devicelist\">M55, C60, MC60</div>\n<div class=\"devicelist\">S55, SL55</div>\n<div class=\"devicelist\">S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</div>\n<div class=\"devicelist\">C65, SL65</div>\n<br>\n<div class=\"devicename\">Motorola</div>\n<div class=\"devicelist\">C380, C650, v220, v180</div>\n<div class=\"devicelist\">v300, v500, v600, v535, v550, v620, E398, E375, v3</div>\n<br>\n<div class=\"devicename\">Samsung</div>\n<div class=\"devicelist\">C100, C108T, C110, S300, S300M, S307</div>\n<div class=\"devicelist\">E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</div>\n<div class=\"devicelist\">X100, X108, X600, X608</div>\n<br>\n<div class=\"devicename\">LG</div>\n<div class=\"devicelist\">G1600</div>\n<br>\n<div class=\"devicename\">SonyEricsson</div>\n<div class=\"devicelist\">T610, T616, T618, T628, T630, T637, Z600, Z608</div>\n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">WILD ROAD<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildroad_scr1.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildroad_scr2.gif\"></div></td>\n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"../games/wildroad_scr3.gif\"></div></td>\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>Оторвись от преследователей, не дай им подорвать твою машину или прыгнуть на неё. Подбирай канистры, так как топливо постоянно вытекает через прострелянные баки.</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n&#1048;&#1084;&#1103;:\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"WILD ROAD(wildroad)\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n          <br>\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu1_about.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1054; &#1053;&#1040;&#1057;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">О НАС<br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu1_about.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1054; &#1053;&#1040;&#1057;</strong></div>\n            </div>\n<div align=\"justify\" class=\"alltext\">\n&nbsp;&nbsp;�������� ColdCore� - ������� ���������� ����������� ���������� Java2ME �������� � �������� ����������� ����������� ����� � ����������, ����������� ������������ ������� ������ ������������ ��������� � ������ �����. ��������� �������� �������� ��� �������� �������� ��������� �������. ����� ��� ���������� ����������, ��� �� �������� ����������� ������ �������� � ������ ��������� �� ��������� �����, ���������� ����� 100 ��� � ���������� ��� ��������� ���������. ���� ������ - ����� ���������� ������� � ������� ���������� � ������ ���������� �������� Java2ME �������� ����� ���������� ������ ����������, ������ ������-��������� � ������ ���������, ���������� ������� �������� �����.<br>�� �� ������ ������������� ��������� ������� ��� ����������� ����������, �� � ������������ ��������� ������ ��� ������� ����������: \n<ul>\n<li>������������ ��������� ��� � ��������� ���������� �� �����.</li>\n<li>������������ ����������� ������� ��� ������ ���������.</li>\n</ul>\n</div>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu1_contacts.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1050;&#1054;&#1053;&#1058;&#1040;&#1050;&#1058;&#1067;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">КОНТАКТЫ<br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu1_contacts.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1050;&#1054;&#1053;&#1058;&#1040;&#1050;&#1058;&#1067;</strong></div>\n            </div>\n<div align=\"left\" class=\"alltext\">\n<br>\n��� ����� ��������: <a href=mailto:support@coldcore.ru>support@coldcore.ru</a><br>\n�������� �� �����: <a href=mailto:webmaster@coldcore.ru>webmaster@coldcore.ru</a><br>\n��� ������������� ���������: <a href=mailto:sales@coldcore.ru>sales@coldcore.ru</a><br>\n</div>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu1_job.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1042;&#1040;&#1050;&#1040;&#1053;&#1057;&#1048;&#1048;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ВАКАНСИИ<br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu1_job.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1042;&#1040;&#1050;&#1040;&#1053;&#1057;&#1048;&#1048;</strong></div>\n            </div>\n<p align=\"center\"><strong><em><font size=\"4\">Sorry, but the page is still under \n  construction....</font></em></strong></p>\n<p align=\"center\"><img src=\"../undercon.gif\" width=\"40\" height=\"38\"></p>\n<p align=\"center\"><strong><font size=\"4\"><em>Visit us later, please...</em></font></strong></p>\n\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu1_news.htm",
    "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1053;&#1054;&#1042;&#1054;&#1057;&#1058;&#1048;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">НОВОСТИ<br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu1_news.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1053;&#1054;&#1042;&#1054;&#1057;&#1058;&#1048;</strong></div>\n            </div>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">05-DEC-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n<img src=\"../news/../games/aneks_ny2006_scr1.gif\" alt=\"scr1\">\n<img src=\"../news/../games/aneks_ny2006_scr3.gif\" alt=\"scr2\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       Выпущен сборник из серии \"Анекдоты\" на Новогоднюю тему. В сборник вошло 60 анекдотов. Приложение поддерживает практически все мобильные телефоны с платформой MIDP-1.0\n       </div>\n       <div align=\"justify\">\n\t\t<span class=\"rightnewsHdr\"><a href=\"./gpage_aneks_ny2006.htm\" target=\"_new\">������ ������...</a>\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">25-NOV-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n<img src=\"../news/../games/slider_alpop_scr1.gif\" alt=\"scr1\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       Вышел слайдер по мультфильму \"Алеша Попович и Тугарин Змей\". Слайдер содержит 10 красочных кадров из мультфильма и текст.\n       </div>\n       <div align=\"justify\">\n\t\t<span class=\"rightnewsHdr\"><a href=\"./gpage_slider_alpop.htm\" target=\"_new\">������ ������...</a>\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">10-SEP-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n<img src=\"../news/../games/smscat_scr2.gif\" alt=\"scr1\">\n<img src=\"../news/../games/smscat_scr3.gif\" alt=\"scr2\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       Закончена разработка приложения \"SMS Catalog\". Приложение позволяет потенциальным клиентам ознакамливаться с содержимым базы контент-провайдера, организованной в удобном древовидном представлении и (если телефон позволяет) формировать SMS с заказом понравившегося контента.\n       </div>\n       <div align=\"justify\">\n\t\t<span class=\"rightnewsHdr\"><a href=\"./gpage_smscat.htm\" target=\"_new\">������ ������...</a>\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">01-AUG-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n<img src=\"../news/../games/airboil_scr1.gif\" alt=\"scr1\">\n<img src=\"../news/../games/airboil_scr3.gif\" alt=\"scr2\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       Вышла игра \"Air Boil\". Игра является аркадой выполненной в классическом стиле. Игроку требуется проходить игровые уровни с нарастающей сложностью, каждая группа уровней заканчивается встречей с \"боссом\".\n       </div>\n       <div align=\"justify\">\n\t\t<span class=\"rightnewsHdr\"><a href=\"./gpage_airboil.htm\" target=\"_new\">������ ������...</a>\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">29-JUN-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n<img src=\"../news/../games/starharbor_scr1.gif\" alt=\"scr1\">\n<img src=\"../news/../games/starharbor_scr2.gif\" alt=\"scr2\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       Ушла в продажу игра \"Star Harbor\". Игра является псевдотрехмерным шутером от первого лица. Игрок играет за стрелка турели космического крейсера и его задача - отразить вторжение инопланетных сил на Землю. Игра имеет три уровня сложности и входит в разряд timekiller приложений. Поддерживает более 100 моделей телефонов, в том числе несколько черно-белых моделей Nokia и Siemens.\n       </div>\n       <div align=\"justify\">\n\t\t<span class=\"rightnewsHdr\"><a href=\"./gpage_starharbor.htm\" target=\"_new\">������ ������...</a>\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">29-JUN-2005</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       Альфа-версия сайта выложена в интернет. К сожалению не все разделы еще функционируют, но как говорится \"..это большой шаг для всего человечества\".\n       </div>\n       </td>\n    </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu1_partnership.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1055;&#1040;&#1056;&#1058;&#1053;&#1045;&#1056;&#1057;&#1058;&#1042;&#1054;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ПАРТНЕРСТВО<br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu1_partnership.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1055;&#1040;&#1056;&#1058;&#1053;&#1045;&#1056;&#1057;&#1058;&#1042;&#1054;</strong></div>\n            </div>\n<p align=\"center\"><strong><em><font size=\"4\">Sorry, but the page is still under \n  construction....</font></em></strong></p>\n<p align=\"center\"><img src=\"../undercon.gif\" width=\"40\" height=\"38\"></p>\n<p align=\"center\"><strong><font size=\"4\"><em>Visit us later, please...</em></font></strong></p>\n\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_all.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1042;&#1057;&#1045;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ВСЕ&nbsp;(43)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_all.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1042;&#1057;&#1045;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFRUITMANIA\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_fruitmania.htm\" target=\"_new\">\n    <img src=\"../games/fruitmania_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Мобильная версия \"Однорукого бандита\", позволяющая играть на реальные деньги.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_fruitmania.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSTRANGE HUNT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_strangehunt.htm\" target=\"_new\">\n    <img src=\"../games/strangehunt_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Тебя занесло на военный полигон, но не сдавайся!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_strangehunt.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tICE GIFTS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_icegifts.htm\" target=\"_new\">\n    <img src=\"../games/icegifts_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Помоги деду Морозу отправить все Новогодние подарки.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_icegifts.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildroad.htm\" target=\"_new\">\n    <img src=\"../games/wildroad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игра в стиле Безумный Макс. Уйди от погони и собирай канистры.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildroad.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tVINEYARD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_vineyard.htm\" target=\"_new\">\n    <img src=\"../games/vineyard_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Пришла пора собирать виноград, но злобные улитки-мутанты не спят.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_vineyard.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOPTER BOMBER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_copterbomber.htm\" target=\"_new\">\n    <img src=\"../games/copterbomber_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Уничтожь противника при помощи нового супервертолета.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_copterbomber.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tTIPPLER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_drunkman.htm\" target=\"_new\">\n    <img src=\"../games/drunkman_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Мобильная версия карточной игры ПЬЯНИЦА на раздевание.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_drunkman.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tAIR BOIL\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_airboil.htm\" target=\"_new\">\n    <img src=\"../games/airboil_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Освободи жителей далекой планеты от господства машин.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_airboil.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSTAR HARBOR\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_starharbor.htm\" target=\"_new\">\n    <img src=\"../games/starharbor_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Ужасное вторжение грозит Земле. Игрок управляет орудием космического крейсера и должен отбить атаку, уничтожив все крейсеры и истребители.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_starharbor.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tKALAH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_kalah.htm\" target=\"_new\">\n    <img src=\"../games/kalah_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Мобильная версия известной настольной игры КАЛАХ. Цель игры - взять как можно больше камней.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_kalah.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPAPANIN'S QUEST\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_papaninsquest.htm\" target=\"_new\">\n    <img src=\"../games/papaninsquest_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок играет за путешественника Папанина, провалившегося в ужасную пирамиду на Южном полюсе и ищущего путь домой.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_papaninsquest.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMOBILE CHASE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mobilechase.htm\" target=\"_new\">\n    <img src=\"../games/mobilechase_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Вы мирно отдыхали на обочине, сидя в своей полицейской машине, когда поступило сообщение об ограблении банка. В погоню!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mobilechase.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCASPIAN MONSTER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_caspianmonster.htm\" target=\"_new\">\n    <img src=\"../games/caspianmonster_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Управляя секретным советским экранопланом, уничтожь противника и найди выход с базы.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_caspianmonster.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tAIR AGGRESSION\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_airaggression.htm\" target=\"_new\">\n    <img src=\"../games/airaggression_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Инопланетные монстры взяли контроль над земными самолетами, спаси мир!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_airaggression.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tBLAZING GEARS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_blazinggears.htm\" target=\"_new\">\n    <img src=\"../games/blazinggears_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Управляя гоночной машиной, надо показать лучшее время.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_blazinggears.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCASTLE ASSAULT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_castleassault.htm\" target=\"_new\">\n    <img src=\"../games/castleassault_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Надо разбить крепостную стену, что бы захватить замок.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_castleassault.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOCKROACH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_cockroach.htm\" target=\"_new\">\n    <img src=\"../games/cockroach_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Управляя тараканом и подбирая разные съедобные и несъедобные предметы, надо найти выход из лабиринта.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_cockroach.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOCONUTS FALL\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_coconutsfall.htm\" target=\"_new\">\n    <img src=\"../games/coconutsfall_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Обезьяна должна отбиться от преследователей орехами.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_coconutsfall.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCONE! CONE!\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_conecone.htm\" target=\"_new\">\n    <img src=\"../games/conecone_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Управляя белкой, собери как можно больше орехов и отбейся от ворон.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_conecone.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFIRING LINE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_firingline.htm\" target=\"_new\">\n    <img src=\"../games/firingline_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Они приходят прямо из открытого космоса, а у тебя только бластер...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_firingline.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFISHER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_fisher.htm\" target=\"_new\">\n    <img src=\"../games/fisher_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Победи в чемпионате по рыболовству, но помни что крючков мало, а акул много...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_fisher.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHARD DAY\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_hardday.htm\" target=\"_new\">\n    <img src=\"../games/hardday_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Тяжела работа курьера в офисе, но Вы не боитесь тяжелой работы...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_hardday.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHUNT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_hunt.htm\" target=\"_new\">\n    <img src=\"../games/hunt_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Зверей в лесу много, а патронов мало.. трать их с толком.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_hunt.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tIRON STREAM\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_ironstream.htm\" target=\"_new\">\n    <img src=\"../games/ironstream_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Внимание! Внимание! Враг прорвал нашу оборону и входит в населенный район! Ваш танк - единственная наша надежда!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_ironstream.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tKICK! KICK!\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_kickkick.htm\" target=\"_new\">\n    <img src=\"../games/kickkick_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет тремя футболистами, закрепленными на одном вращающемся стержне.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_kickkick.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tLIFESAVER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_lifesaver.htm\" target=\"_new\">\n    <img src=\"../games/lifesaver_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Огонь перекрыл выходы и жители прыгают из горящих окон, спаси их!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_lifesaver.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tLIVE BRIDGE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_livebridge.htm\" target=\"_new\">\n    <img src=\"../games/livebridge_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Срочная посылка, но мост уже вторую пятилетку в ремонте. Придется воспользоваться черепахами...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_livebridge.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tNIMBLE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_nimble.htm\" target=\"_new\">\n    <img src=\"../games/nimble_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет рабочим  в аэропорту, который должен разобрать перепутанный багаж на лентах транспортера.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_nimble.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tOPERATION THUNDERCLAP\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_opthunderclap.htm\" target=\"_new\">\n    <img src=\"../games/opthunderclap_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок выступает в роли пилота боевого вертолета, в задачу которого входит уничтожение как можно большего количества вертолетов противника.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_opthunderclap.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tOYSTER BANK\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_oysterbank.htm\" target=\"_new\">\n    <img src=\"../games/oysterbank_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет ныряльщиком, охотящимся за жемчужинами на морском дне.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_oysterbank.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tRAVEN'S CHEESE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_ravenscheese.htm\" target=\"_new\">\n    <img src=\"../games/ravenscheese_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Вороне Бог послал кусочек сыра, но трудно будет лисе если целая стая ворон бомбит её сыром...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_ravenscheese.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSEA ROVERS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_searovers.htm\" target=\"_new\">\n    <img src=\"../games/searovers_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    А не поохотиться ли со скуки на торговые корабли в открытом море? А почему бы и нет?\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_searovers.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSEA ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_searoad.htm\" target=\"_new\">\n    <img src=\"../games/searoad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет спортивным катером, принимающим участие в слаломе на оживленном морском пути.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_searoad.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMOBILE SHERIFF\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mobilesheriff.htm\" target=\"_new\">\n    <img src=\"../games/mobilesheriff_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет шерифом, освобождающим маленький техасский город от банды.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mobilesheriff.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSMASHING KICK\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_smashingkick.htm\" target=\"_new\">\n    <img src=\"../games/smashingkick_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок  управляет тренирующимся футболистом и его задача довести как можно больше мячей до ворот, не роняя их на землю.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_smashingkick.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSPIDERS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_spiders.htm\" target=\"_new\">\n    <img src=\"../games/spiders_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет муравьем, который должен носить в муравейник веточки из лежащей невдалеке кучи и не стать добычей пауков, спускающихся сверху на паутине.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_spiders.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tTASTY DISH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_tastydish.htm\" target=\"_new\">\n    <img src=\"../games/tastydish_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет крокодилом, охотящимся в реке у берега.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_tastydish.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWATER WAY\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_waterway.htm\" target=\"_new\">\n    <img src=\"../games/waterway_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Вы управляете муравьем, собирающим воду для муравейников.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_waterway.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD BALLS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildballs.htm\" target=\"_new\">\n    <img src=\"../games/wildballs_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок  осуществляет игру в футуристические кегли и его задача выбить как  можно больше кеглей, зарабатывая очки при ограниченном количестве шаров.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildballs.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMTV PUZZLE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpuzzle.htm\" target=\"_new\">\n    <img src=\"../games/mtvpuzzle_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Известная игра 15 на тему MTV.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpuzzle.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPAPARAZZO\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpaparazzo.htm\" target=\"_new\">\n    <img src=\"../games/mtvpaparazzo_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Нащелкай как можно больше звезд на свой фотик...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpaparazzo.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPILLOW\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpillow.htm\" target=\"_new\">\n    <img src=\"../games/mtvpillow_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Не любишь виджеев? Ну тогда подушку в руки и пошли отрываться в офисе МТВ...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpillow.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHOLD OUT ON THE STAGE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvstage.htm\" target=\"_new\">\n    <img src=\"../games/mtvstage_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Петь мы все любим, но не у всех есть слух. Главное - уворачиваться от тяжелых предметов...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvstage.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_arcade.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1040;&#1056;&#1050;&#1040;&#1044;&#1067;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">АРКАДЫ&nbsp;(32)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_arcade.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1040;&#1056;&#1050;&#1040;&#1044;&#1067;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildroad.htm\" target=\"_new\">\n    <img src=\"../games/wildroad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игра в стиле Безумный Макс. Уйди от погони и собирай канистры.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildroad.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tVINEYARD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_vineyard.htm\" target=\"_new\">\n    <img src=\"../games/vineyard_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Пришла пора собирать виноград, но злобные улитки-мутанты не спят.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_vineyard.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOPTER BOMBER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_copterbomber.htm\" target=\"_new\">\n    <img src=\"../games/copterbomber_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Уничтожь противника при помощи нового супервертолета.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_copterbomber.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tAIR BOIL\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_airboil.htm\" target=\"_new\">\n    <img src=\"../games/airboil_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Освободи жителей далекой планеты от господства машин.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_airboil.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMOBILE CHASE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mobilechase.htm\" target=\"_new\">\n    <img src=\"../games/mobilechase_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Вы мирно отдыхали на обочине, сидя в своей полицейской машине, когда поступило сообщение об ограблении банка. В погоню!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mobilechase.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCASPIAN MONSTER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_caspianmonster.htm\" target=\"_new\">\n    <img src=\"../games/caspianmonster_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Управляя секретным советским экранопланом, уничтожь противника и найди выход с базы.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_caspianmonster.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tAIR AGGRESSION\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_airaggression.htm\" target=\"_new\">\n    <img src=\"../games/airaggression_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Инопланетные монстры взяли контроль над земными самолетами, спаси мир!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_airaggression.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCASTLE ASSAULT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_castleassault.htm\" target=\"_new\">\n    <img src=\"../games/castleassault_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Надо разбить крепостную стену, что бы захватить замок.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_castleassault.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOCKROACH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_cockroach.htm\" target=\"_new\">\n    <img src=\"../games/cockroach_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Управляя тараканом и подбирая разные съедобные и несъедобные предметы, надо найти выход из лабиринта.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_cockroach.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCOCONUTS FALL\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_coconutsfall.htm\" target=\"_new\">\n    <img src=\"../games/coconutsfall_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Обезьяна должна отбиться от преследователей орехами.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_coconutsfall.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tCONE! CONE!\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_conecone.htm\" target=\"_new\">\n    <img src=\"../games/conecone_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Управляя белкой, собери как можно больше орехов и отбейся от ворон.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_conecone.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFISHER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_fisher.htm\" target=\"_new\">\n    <img src=\"../games/fisher_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Победи в чемпионате по рыболовству, но помни что крючков мало, а акул много...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_fisher.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHARD DAY\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_hardday.htm\" target=\"_new\">\n    <img src=\"../games/hardday_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Тяжела работа курьера в офисе, но Вы не боитесь тяжелой работы...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_hardday.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHUNT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_hunt.htm\" target=\"_new\">\n    <img src=\"../games/hunt_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Зверей в лесу много, а патронов мало.. трать их с толком.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_hunt.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tIRON STREAM\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_ironstream.htm\" target=\"_new\">\n    <img src=\"../games/ironstream_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Внимание! Внимание! Враг прорвал нашу оборону и входит в населенный район! Ваш танк - единственная наша надежда!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_ironstream.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tLIFESAVER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_lifesaver.htm\" target=\"_new\">\n    <img src=\"../games/lifesaver_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Огонь перекрыл выходы и жители прыгают из горящих окон, спаси их!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_lifesaver.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tLIVE BRIDGE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_livebridge.htm\" target=\"_new\">\n    <img src=\"../games/livebridge_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Срочная посылка, но мост уже вторую пятилетку в ремонте. Придется воспользоваться черепахами...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_livebridge.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tNIMBLE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_nimble.htm\" target=\"_new\">\n    <img src=\"../games/nimble_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет рабочим  в аэропорту, который должен разобрать перепутанный багаж на лентах транспортера.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_nimble.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tOPERATION THUNDERCLAP\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_opthunderclap.htm\" target=\"_new\">\n    <img src=\"../games/opthunderclap_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок выступает в роли пилота боевого вертолета, в задачу которого входит уничтожение как можно большего количества вертолетов противника.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_opthunderclap.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tOYSTER BANK\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_oysterbank.htm\" target=\"_new\">\n    <img src=\"../games/oysterbank_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет ныряльщиком, охотящимся за жемчужинами на морском дне.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_oysterbank.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tRAVEN'S CHEESE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_ravenscheese.htm\" target=\"_new\">\n    <img src=\"../games/ravenscheese_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Вороне Бог послал кусочек сыра, но трудно будет лисе если целая стая ворон бомбит её сыром...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_ravenscheese.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSEA ROVERS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_searovers.htm\" target=\"_new\">\n    <img src=\"../games/searovers_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    А не поохотиться ли со скуки на торговые корабли в открытом море? А почему бы и нет?\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_searovers.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSEA ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_searoad.htm\" target=\"_new\">\n    <img src=\"../games/searoad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет спортивным катером, принимающим участие в слаломе на оживленном морском пути.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_searoad.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMOBILE SHERIFF\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mobilesheriff.htm\" target=\"_new\">\n    <img src=\"../games/mobilesheriff_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет шерифом, освобождающим маленький техасский город от банды.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mobilesheriff.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSMASHING KICK\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_smashingkick.htm\" target=\"_new\">\n    <img src=\"../games/smashingkick_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок  управляет тренирующимся футболистом и его задача довести как можно больше мячей до ворот, не роняя их на землю.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_smashingkick.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSPIDERS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_spiders.htm\" target=\"_new\">\n    <img src=\"../games/spiders_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет муравьем, который должен носить в муравейник веточки из лежащей невдалеке кучи и не стать добычей пауков, спускающихся сверху на паутине.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_spiders.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tTASTY DISH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_tastydish.htm\" target=\"_new\">\n    <img src=\"../games/tastydish_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет крокодилом, охотящимся в реке у берега.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_tastydish.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWATER WAY\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_waterway.htm\" target=\"_new\">\n    <img src=\"../games/waterway_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Вы управляете муравьем, собирающим воду для муравейников.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_waterway.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD BALLS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildballs.htm\" target=\"_new\">\n    <img src=\"../games/wildballs_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок  осуществляет игру в футуристические кегли и его задача выбить как  можно больше кеглей, зарабатывая очки при ограниченном количестве шаров.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildballs.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPAPARAZZO\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpaparazzo.htm\" target=\"_new\">\n    <img src=\"../games/mtvpaparazzo_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Нащелкай как можно больше звезд на свой фотик...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpaparazzo.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPILLOW\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpillow.htm\" target=\"_new\">\n    <img src=\"../games/mtvpillow_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Не любишь виджеев? Ну тогда подушку в руки и пошли отрываться в офисе МТВ...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpillow.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tHOLD OUT ON THE STAGE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvstage.htm\" target=\"_new\">\n    <img src=\"../games/mtvstage_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Петь мы все любим, но не у всех есть слух. Главное - уворачиваться от тяжелых предметов...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvstage.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_clientserver.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1050;&#1051;&#1048;&#1045;&#1053;&#1058;-&#1057;&#1045;&#1056;&#1042;&#1045;&#1056;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">КЛИЕНТ-СЕРВЕР&nbsp;(1)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_clientserver.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1050;&#1051;&#1048;&#1045;&#1053;&#1058;-&#1057;&#1045;&#1056;&#1042;&#1045;&#1056;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFRUITMANIA\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_fruitmania.htm\" target=\"_new\">\n    <img src=\"../games/fruitmania_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Мобильная версия \"Однорукого бандита\", позволяющая играть на реальные деньги.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_fruitmania.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_erotic.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1069;&#1056;&#1054;&#1058;&#1048;&#1063;&#1045;&#1057;&#1050;&#1048;&#1045;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ЭРОТИЧЕСКИЕ&nbsp;(1)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_erotic.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1069;&#1056;&#1054;&#1058;&#1048;&#1063;&#1045;&#1057;&#1050;&#1048;&#1045;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tTIPPLER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_drunkman.htm\" target=\"_new\">\n    <img src=\"../games/drunkman_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Мобильная версия карточной игры ПЬЯНИЦА на раздевание.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_drunkman.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_fighting.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1044;&#1056;&#1040;&#1050;&#1048;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ДРАКИ&nbsp;(0)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_fighting.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1044;&#1056;&#1040;&#1050;&#1048;</strong></div>\n            </div>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_gambling.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1040;&#1047;&#1040;&#1056;&#1058;&#1053;&#1067;&#1045;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">АЗАРТНЫЕ&nbsp;(2)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_gambling.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1040;&#1047;&#1040;&#1056;&#1058;&#1053;&#1067;&#1045;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFRUITMANIA\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_fruitmania.htm\" target=\"_new\">\n    <img src=\"../games/fruitmania_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Мобильная версия \"Однорукого бандита\", позволяющая играть на реальные деньги.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_fruitmania.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tTIPPLER\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_drunkman.htm\" target=\"_new\">\n    <img src=\"../games/drunkman_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Мобильная версия карточной игры ПЬЯНИЦА на раздевание.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_drunkman.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_logic.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1051;&#1054;&#1043;&#1048;&#1063;&#1045;&#1057;&#1050;&#1048;&#1045;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ЛОГИЧЕСКИЕ&nbsp;(3)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_logic.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1051;&#1054;&#1043;&#1048;&#1063;&#1045;&#1057;&#1050;&#1048;&#1045;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tICE GIFTS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_icegifts.htm\" target=\"_new\">\n    <img src=\"../games/icegifts_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Помоги деду Морозу отправить все Новогодние подарки.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_icegifts.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tKALAH\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_kalah.htm\" target=\"_new\">\n    <img src=\"../games/kalah_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Мобильная версия известной настольной игры КАЛАХ. Цель игры - взять как можно больше камней.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_kalah.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMTV PUZZLE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mtvpuzzle.htm\" target=\"_new\">\n    <img src=\"../games/mtvpuzzle_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Известная игра 15 на тему MTV.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mtvpuzzle.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_multiplayer.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1052;&#1059;&#1051;&#1068;&#1058;&#1048;&#1055;&#1051;&#1045;&#1045;&#1056;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">МУЛЬТИПЛЕЕР&nbsp;(0)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_multiplayer.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1052;&#1059;&#1051;&#1068;&#1058;&#1048;&#1055;&#1051;&#1045;&#1045;&#1056;</strong></div>\n            </div>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_quest.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1050;&#1042;&#1045;&#1057;&#1058;&#1067;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">КВЕСТЫ&nbsp;(1)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_quest.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1050;&#1042;&#1045;&#1057;&#1058;&#1067;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tPAPANIN'S QUEST\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_papaninsquest.htm\" target=\"_new\">\n    <img src=\"../games/papaninsquest_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок играет за путешественника Папанина, провалившегося в ужасную пирамиду на Южном полюсе и ищущего путь домой.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_papaninsquest.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_racing.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1043;&#1054;&#1053;&#1050;&#1048;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ГОНКИ&nbsp;(4)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_racing.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1043;&#1054;&#1053;&#1050;&#1048;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildroad.htm\" target=\"_new\">\n    <img src=\"../games/wildroad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игра в стиле Безумный Макс. Уйди от погони и собирай канистры.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildroad.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tMOBILE CHASE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_mobilechase.htm\" target=\"_new\">\n    <img src=\"../games/mobilechase_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Вы мирно отдыхали на обочине, сидя в своей полицейской машине, когда поступило сообщение об ограблении банка. В погоню!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_mobilechase.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tBLAZING GEARS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_blazinggears.htm\" target=\"_new\">\n    <img src=\"../games/blazinggears_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Управляя гоночной машиной, надо показать лучшее время.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_blazinggears.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSEA ROAD\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_searoad.htm\" target=\"_new\">\n    <img src=\"../games/searoad_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет спортивным катером, принимающим участие в слаломе на оживленном морском пути.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_searoad.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_shooter.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1057;&#1058;&#1056;&#1045;&#1051;&#1071;&#1051;&#1050;&#1048;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">СТРЕЛЯЛКИ&nbsp;(3)<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_shooter.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1057;&#1058;&#1056;&#1045;&#1051;&#1071;&#1051;&#1050;&#1048;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSTRANGE HUNT\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_strangehunt.htm\" target=\"_new\">\n    <img src=\"../games/strangehunt_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Тебя занесло на военный полигон, но не сдавайся!\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_strangehunt.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSTAR HARBOR\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_starharbor.htm\" target=\"_new\">\n    <img src=\"../games/starharbor_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Ужасное вторжение грозит Земле. Игрок управляет орудием космического крейсера и должен отбить атаку, уничтожив все крейсеры и истребители.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_starharbor.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tFIRING LINE\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_firingline.htm\" target=\"_new\">\n    <img src=\"../games/firingline_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Они приходят прямо из открытого космоса, а у тебя только бластер...\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_firingline.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu2_sport.htm",
    "content": "\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1048;&#1043;&#1056;&#1067;/&#1057;&#1055;&#1054;&#1056;&#1058;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">СПОРТ&nbsp;(3)<br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu3_appsall.htm\">ВСЕ&nbsp;(3)</a><br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu2_sport.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1057;&#1055;&#1054;&#1056;&#1058;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tKICK! KICK!\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_kickkick.htm\" target=\"_new\">\n    <img src=\"../games/kickkick_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок управляет тремя футболистами, закрепленными на одном вращающемся стержне.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_kickkick.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSMASHING KICK\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_smashingkick.htm\" target=\"_new\">\n    <img src=\"../games/smashingkick_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок  управляет тренирующимся футболистом и его задача довести как можно больше мячей до ворот, не роняя их на землю.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_smashingkick.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tWILD BALLS\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_wildballs.htm\" target=\"_new\">\n    <img src=\"../games/wildballs_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Игрок  осуществляет игру в футуристические кегли и его задача выбить как  можно больше кеглей, зарабатывая очки при ограниченном количестве шаров.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_wildballs.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/menu3_appsall.htm",
    "content": "\n\n\n\n\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n<title>ColdCore/&#1055;&#1056;&#1048;&#1051;&#1054;&#1046;&#1045;&#1053;&#1048;&#1071;/&#1042;&#1057;&#1045;</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n\n<div>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_news.htm\">НОВОСТИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_about.htm\">О НАС</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_partnership.htm\">ПАРТНЕРСТВО</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_job.htm\">ВАКАНСИИ</a><br>\n\n    \n\n      <img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu1_contacts.htm\">КОНТАКТЫ</a><br>\n<br></div>\n\n<div>\nИГРЫ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_all.htm\">ВСЕ&nbsp;(43)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_arcade.htm\">АРКАДЫ&nbsp;(32)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_erotic.htm\">ЭРОТИЧЕСКИЕ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_fighting.htm\">ДРАКИ&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_gambling.htm\">АЗАРТНЫЕ&nbsp;(2)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_logic.htm\">ЛОГИЧЕСКИЕ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_multiplayer.htm\">МУЛЬТИПЛЕЕР&nbsp;(0)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_clientserver.htm\">КЛИЕНТ-СЕРВЕР&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_quest.htm\">КВЕСТЫ&nbsp;(1)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_racing.htm\">ГОНКИ&nbsp;(4)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_shooter.htm\">СТРЕЛЯЛКИ&nbsp;(3)</a><br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"./menu2_sport.htm\">СПОРТ&nbsp;(3)</a><br>\n<br></div>\n\n<div>\nПРИЛОЖЕНИЯ<br>\n\n    \n\n      &nbsp;&nbsp;&nbsp;<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">ВСЕ&nbsp;(3)<br>\n<br></div>\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">RUS</font></div></td>\n\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"../eng/menu3_appsall.htm\">ENG</a></div></td>\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>&#1042;&#1057;&#1045;</strong></div>\n            </div>\n<br>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tThe collection 'New Year's jokes'\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_aneks_ny2006.htm\" target=\"_new\">\n    <img src=\"../games/aneks_ny2006_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Сборник \"НОВОГОДНИЕ АНЕКДОТЫ\", содержит 60 отборных Новогодних историй.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_aneks_ny2006.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSlider 'Aleosha Popovich'\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_slider_alpop.htm\" target=\"_new\">\n    <img src=\"../games/slider_alpop_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Слайдер по известному мультфильму \"Алеша Попович и Тугарин Змей\"\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_slider_alpop.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n<hr align=\"center\" noshade>\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \tSMS Catalog\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"gpage_smscat.htm\" target=\"_new\">\n    <img src=\"../games/smscat_splash.jpg\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    Электронный каталог мобильного контента с возможностью заказа и обновления через WAP.\n\t<br>\n\t\t<span class=\"rightnewsHdr\"><a href=\"gpage_smscat.htm\" target=\"_new\">������ ������...</a></div></td>\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Papanin's quest</span><br>\n</div>\n<div align=\"justify\">Увлекательная игра \"Papanin's quest\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Mobile chase</span><br>\n</div>\n<div align=\"justify\">Увлекательнейшая гонка с элементами шутера \"Mobile Chase\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/race/Mobile_Chase\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Air aggression</span><br>\n</div>\n<div align=\"justify\">Аркада \"Air aggression\" для Nokia Series 60, доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Caspian monster</span><br>\n</div>\n<div align=\"justify\">Очень красочный скроллшутер \"Caspian monster\" для Nokia Series 60, доступен на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">Kalah</span><br>\n</div>\n<div align=\"justify\">Восточная игра Калах, теперь имеет свою уникальную интерпретацию на мобильных телефонах Nokia Series 60 и доступна на Playmobile.<br>\n<span class=\"rightnewsHdr\"><a href=\"http://www.playmobile.ru/games/logic/Kalah\" target=\"_new\">������ ������...</a></div></td>\n</tr>\n</table>\n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n<div align=\"justify\" class=\"footer\">Copyright © ColdCore® 2005-2007. Символы \"™\" и \"®\" показывают торговые марки и зарегистрированные торговые марки их полноправных владельцев.</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/send_error.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>�� ���� ��������� ���������.</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#FF9393\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../x_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>�� ���� ��������� ���������, �������� �������� �� �������. ���������� ���������� �����.</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/rus/send_ok.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>��������� ���������� �������.</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#C4CFFF\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../i_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>���� ��������� ������� ����������. �������!</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/etl/wap/index.wml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n<wml>\n<card id=\"main\" title=\"COLDCORE WAP\">\n<p>\n<img src=\"/logo.wbmp\" alt=\"ColdCore(R)\"/>\n<br/><br/>\n<strong>Sorry, under construction...</strong>\n<do type=\"option\" label=\"Back\"><prev/></do>\n</p>\n</card>\n</wml>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/about.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body>\n//#+\n//#if curLangID==\"rus\"\n<div align=\"justify\" class=\"alltext\">\n&nbsp;&nbsp; ColdCore -     Java2ME        ,         .        .    ,            ,   100      .   -           Java2ME     ,  -   ,    .<br>        ,        : \n<ul>\n<li>       .</li>\n<li>     .</li>\n</ul>\n</div>\n//#else\n<div align=\"justify\" class=\"alltext\">\n&nbsp;&nbsp;ColdCore is a leader in Java2ME content development. We have unique skills and technologies that enable us to develop hi-end production under time. Our production is published under leading worldwide trademarks and our portfolio contains more than 100 games and applications for mobile devices. Our mission is to become a global leader in mobile Java2ME game content development through development the best technologies, the best workflows and the best products that meet requirements of the market.<br>We not only develop mobile applications for own sales but also we implement outside orders like:\n<ul>\n<li>Development of mobile games and mobile applications to order.</li>\n<li>Development of parts for customer's systems.</li>\n</ul>\n</div>\n//#endif\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/channels.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<channels>\n\t<channel id=\"SIMONE\">\n        <name>\n           <lang id=\"rus\">&#1057;&#1048;&#1052;&#1054;&#1053;&#1040;</lang>\n\t\t   <lang id=\"eng\">SIMONE</lang>\n        </name>\n\t\t<reference>\n\t\t   <lang id=\"rus\">&#1050;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;</lang>\n\t\t   <lang id=\"eng\">A content provider</lang>\n\t\t</reference>\n        <link>\n\t\t   <lang id=\"rus\">http://www.simona.ru</lang>\n\t\t   <lang id=\"eng\">http://www.simona.ru</lang>\n\t\t</link>\n\t</channel>\n</channels>"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/cmn/sendfeedback.phtml",
    "content": "<?\n$fText=\"$fTitle\\n\\n\";\n$fText.=date(\"l dS of F Y h:i:s A\").\"\\n\\n\";\n\n$fText.=\"Name: $fName\\n\";\n$fText.=\"Email: $fEmail\\n\\n\";\n\n$fText.=$fComment;\n$fText.=\"\\n\\n\";\n\nif (mail(\"feedback@coldcore.ru\",$fSubject,$fText)) {Header(\"Location: $fOk\");}\nelse {Header(\"Location: $fBad\");}\nexit;\n?>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/cmn/styles.css",
    "content": "body {\n\tmargin-left: 0px;\n\tmargin-top: 0px;\n\tmargin-right: 0px;\n\tmargin-bottom: 0px;\n\tbackground-color: #FFFFFF;\n}\n.menuheader {\nFONT-WEIGHT: normal;\n FONT-SIZE: 14px;\n  COLOR: #BFBFFF;\n   FONT-FAMILY: \"Small Fonts\", \"Arial Black\", Arial, Helvetica, sans-serif}\n.menu {\n\tFONT-WEIGHT: bold;\n\tFONT-SIZE: 11px;\n\tCOLOR: white;\n\tFONT-FAMILY: Arial, Helvetica, sans-serif;\n\tTEXT-DECORATION: none;\n}\n.alltext {\n\tFONT-WEIGHT: normal;\n\tFONT-FAMILY: \"Times New Roman\", Times, serif;\n\tCOLOR: black;\n\tTEXT-DECORATION: none;\n\tfont-size: 12px;\n\tfont-style: normal;\n}\n.newdata {\nFONT-WEIGHT: bold;\n FONT-SIZE: 11px;\n  COLOR: #000000;\n   FONT-FAMILY: Arial, Helvetica, sans-serif}\n\n.footer {\n\tfont-size: x-small;\n\tfont-family: Arial, Helvetica, sans-serif;\n\tcolor: #999999;\n\n}\n.langtxt {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 11px;\n\tfont-style: normal;\n\tfont-weight: bold;\n}\n\n.rightnews {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 9px;\n}\n.rightnewsHdr {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n}\n\na:link {\n\ttext-decoration: none;\n\tcolor: #00BBFF;\n}\na:visited {\n\ttext-decoration: none;\n\tcolor: #00BBFF;\n}\na:hover {\n\ttext-decoration: none;\n\tcolor: #00FF00;\n}\na:active {\n\ttext-decoration: none;\n\tcolor: #00BBFF;\n}\n.catalogheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 16px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheadermin {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/cmn/styles2.css",
    "content": "body {\n\tmargin-left: 0px;\n\tmargin-top: 0px;\n\tmargin-right: 0px;\n\tmargin-bottom: 0px;\n\tbackground-color: #FFFFFF;\n}\n.menuheader {\nFONT-WEIGHT: normal;\n FONT-SIZE: 14px;\n  COLOR: #BFBFFF;\n   FONT-FAMILY: \"Small Fonts\", \"Arial Black\", Arial, Helvetica, sans-serif}\n.menu {\n\tFONT-WEIGHT: bold;\n\tFONT-SIZE: 11px;\n\tCOLOR: white;\n\tFONT-FAMILY: Arial, Helvetica, sans-serif;\n\tTEXT-DECORATION: none;\n}\n.alltext {\n\tFONT-WEIGHT: normal;\n\tFONT-FAMILY: \"Times New Roman\", Times, serif;\n\tCOLOR: black;\n\tTEXT-DECORATION: none;\n\tfont-size: 12px;\n\tfont-style: normal;\n}\n.newdata {\nFONT-WEIGHT: bold;\n FONT-SIZE: 11px;\n  COLOR: #000000;\n   FONT-FAMILY: Arial, Helvetica, sans-serif}\n\n.footer {\n\tfont-size: x-small;\n\tfont-family: Arial, Helvetica, sans-serif;\n\tcolor: #999999;\n\n}\n.langtxt {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 11px;\n\tfont-style: normal;\n\tfont-weight: bold;\n}\n\n.rightnews {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 9px;\n}\n.rightnewsHdr {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n}\n\na:link {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\na:visited {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\na:hover {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\na:active {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\n.catalogheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 16px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheadermin {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.devicename {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.devicelist {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 10px;\n\tfont-weight: normal;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.sendformref {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.sendformhdr {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.sendformtxt {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: normal;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n\n.sendformfield {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/contacts.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body>\n//#+\n<div align=\"left\" class=\"alltext\">\n<br>\n//#if curLangID==\"rus\"\n  : <a href=mailto:support@coldcore.ru>support@coldcore.ru</a><br>\n  : <a href=mailto:webmaster@coldcore.ru>webmaster@coldcore.ru</a><br>\n  : <a href=mailto:sales@coldcore.ru>sales@coldcore.ru</a><br>\n//#else\nInformation: <a href=mailto:support@coldcore.ru>support@coldcore.ru</a><br>\nWebsite: <a href=mailto:webmaster@coldcore.ru>webmaster@coldcore.ru</a><br>\nMarketing: <a href=mailto:sales@coldcore.ru>sales@coldcore.ru</a><br>\n//#endif\n</div>\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/devices.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<devices>\n\t<nokia name=\"Nokia\">\n      <series30bw>3410</series30bw>\n      <series30c>3510i</series30c>\n\t  <series40dp1>7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</series40dp1>\n      <series40dp2>6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</series40dp2>\n      <series40dp2b>6230i, 8800</series40dp2b>\n      <series60dp1>3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</series60dp1>\n      <series60dp2a>6600, 6620</series60dp2a>\n      <series60dp2b>7610, 6260, 6670, 3230</series60dp2b>\n      <series60dp2c>6630</series60dp2c>\n\t</nokia>\n\t<siemens name=\"Siemens\">\n\t\t<series45a>M(T)50, C55, C56, CT56, 6688i, M46, 3118</series45a>\n\t\t<series45b>SL45i</series45b>\n        <series55a>M55, C60, MC60</series55a>\n        <series55b>S55, SL55</series55b>\n        <series65a>S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</series65a>\n        <series65b>C65, SL65</series65b>\n\t</siemens>\n\t<motorola name=\"Motorola\">\n\t\t<seriesC380>C380, C650, v220, v180</seriesC380>\n        <seriesA008>Accompli 008</seriesA008>\n        <seriesE398>v300, v500, v600, v535, v550, v620, E398, E375, v3</seriesE398>\n\t</motorola>\n    <samsung name=\"Samsung\">\n\t\t<group1>D108, S100, S105, X400, X426, X427, X430</group1>\n\t\t<group2>E400, S200, S208</group2>\n\t\t<group3>C100, C108T, C110, S300, S300M, S307</group3>\n\t\t<group4>E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</group4>\n\t\t<group5>X100, X108, X600, X608</group5>\n\t\t<group6a>E105, E315, E316, E317, E710, E715, P400, P510, P518, X427M, X450, X458, X475</group6a>\n\t\t<group6b>E217, E335, E635, X640</group6b>\n\t\t<group7>C200, C207, C208, C225, E600, E608, X105</group7>\n\t\t<group8>D410, D415, D418, P207, P777</group8>\n\t\t<group9>E300, E310, E810, X480</group9>\n\t\t<group10>X120, X140</group10>\n\t\t<group11>E610, E618, P730, P735</group11>\n\t\t<group12a>D500, D508, E730</group12a>\n\t\t<group12b>E530, E620, E720, E880</group12b>\n\t\t<group12c>D600</group12c>\n\t\t<group13>Z105, Z107</group13>\n\t\t<group14>Z110</group14>\n\t\t<group15a>Z130</group15a>\n\t\t<group15b>Z140, Z300, Z500</group15b>\n\t</samsung>\n    <lg name=\"LG\">\n\t\t<seriesG1600>G1600</seriesG1600>\n\t</lg>\n    <se name=\"SonyEricsson\">\n\t\t<series610>T610, T616, T618, T628, T630, T637, Z600, Z608</series610>\n\t</se>\n</devices>"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/eng/send_error.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>I can't deliver the message.</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#FF9393\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../x_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>I can't deliver the message. May be the server has troubles, if it is possible resend the message later. Thank you.</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/eng/send_ok.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Your message has been delivered successfully.</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#C4CFFF\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../i_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>Your message has been delivered successfully. Thank you very much!</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/gamelist.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n<body>\n//#+\n<br>\n//#local gl_curGameIndex = 0\n//#local gl_counterOutGames = 0\n//#while gl_curGameIndex<xml_size(games_list)\n//#local gl_currentGameElement = xml_get(games_list,gl_curGameIndex)\n//#if xml_size(xml_list(gl_currentGameElement,currentItemID))>0\n//#local gl_gameID = xml_attr(gl_currentGameElement,\"id\")\n//#local gl_gamePageLink = \"gpage_\"+gl_gameID+\".htm\"\n//#local gl_gameReference = xml_get(xml_list(gl_currentGameElement,\"shortreference\"),0)\n//#local gl_gameReferenceName = str2web(xml_attr(gl_currentGameElement,\"title\"))\n//#local gl_gameReferenceText = xml_text(xml_get(xml_list(gl_gameReference,curLangID),0))\n//#if gl_counterOutGames!=0\n<hr align=\"center\" noshade>\n//#endif\n//#local gl_counterOutGames = gl_counterOutGames + 1\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \t/*$gl_gameReferenceName$*/\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"/*$gl_gamePageLink$*/\" target=\"_new\">\n    <img src=\"/*$\"../games/\"+gl_gameID+\"_splash.jpg\"$*/\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    /*$gl_gameReferenceText$*/\n\t<br>\n\t//#if curLangID==\"rus\"\n\t\t<span class=\"rightnewsHdr\"><a href=\"/*$gl_gamePageLink$*/\" target=\"_new\"> ...</a></div></td>\n\t//#else\n\t\t<span class=\"rightnewsHdr\"><a href=\"/*$gl_gamePageLink$*/\" target=\"_new\">read more...</a></div></td>\n\t//#endif\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n//#endif\n//#local gl_curGameIndex = gl_curGameIndex + 1\n//#end\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/gameref.htm",
    "content": "//#noautoflush\n//#local gref_langs = xml_root(xml_open(\"site.xml\"))\n//#local gref_devices = xml_root(xml_open(\"devices.xml\"))\n//#local gref_footer = xml_get(xml_list(xml_root(xml_open(\"site.xml\")),\"footer\"),0)\n//#local gref_langs = xml_list(xml_get(xml_list(gref_langs,\"languages\"),0),\"lang\")\n\n//#local gref_docRoot = xml_root(xml_open(\"games.xml\"))\n//#local gref_gamesList = xml_list(xml_get(xml_list(gref_docRoot,\"games\"),0),\"game\")\n//#local gref_channelsList = xml_get(xml_list(gref_docRoot,\"channels\"),0)\n//#local gref_ownersList = xml_get(xml_list(gref_docRoot,\"owners\"),0)\n\n//#local gref_langIndex = 0\n//#while gref_langIndex<xml_size(gref_langs)\n//#local gref_curLangID = xml_attr(xml_get(gref_langs,gref_langIndex),\"id\") \n//#local gref_curLangFooter = xml_text(xml_get(xml_list(gref_footer,gref_curLangID),0))\n\n//#outdir gref_curLangID\n\n//#local gref_curGameIndex = 0\n//#while gref_curGameIndex<xml_size(gref_gamesList)\n\n//#local gref_currentGameElement = xml_get(gref_gamesList,gref_curGameIndex)\n//#local gref_currentGameScreens = xml_attr(gref_currentGameElement,\"screens\")\n//#local gref_currentGameID = xml_attr(gref_currentGameElement,\"id\")\n//#local gref_currentGameTitle = xml_attr(gref_currentGameElement,\"title\")\n//#local gref_currentGameYear = xml_attr(gref_currentGameElement,\"year\")\n\n//#local gref_currentGameDevices = xml_list(xml_get(xml_list(gref_currentGameElement,\"devices\"),0),\"*\")\n\n//#local gref_currentGameReference =xml_text(xml_get(xml_list(xml_get(xml_list(gref_currentGameElement,\"reference\"),0),gref_curLangID),0))\n\n//#local gref_currentOwnerElement = xml_get(xml_list(gref_ownersList,xml_attr(xml_get(xml_list(gref_currentGameElement,\"owner\"),0),\"id\")),0)\n//#local gref_currentSalesList = xml_list(xml_get(xml_list(gref_currentGameElement,\"sales\"),0),\"*\")\n\n//#local gref_pageName = \"gpage_\"+gref_currentGameID+\".htm\"\n//#outname gref_pageName\n//#echo Making game reference file /*$gref_pageName$*/\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)//*$gref_currentGameTitle$*/</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"/*$\"../games/\"+gref_currentGameID+\"_splash.jpg\"$*/\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n//#if gref_curLangID==\"rus\"\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n//#else\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n//#endif\n        <div><a href=\"/*$xml_attr(gref_currentOwnerElement,\"link\")$*/\" target=\"_new\" class=\"gameinfoheadermin\">/*$str2web(xml_text(gref_currentOwnerElement))$*/</a></div>\n         <br>\n//#if gref_curLangID==\"rus\"\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n//#else\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n//#endif\n         <div><strong>/*$gref_currentGameYear$*/</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n//#if gref_curLangID==\"rus\"\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n//#else\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n//#endif\n        <hr align=\"center\" noshade>\n\n//#local gref_curDeviceIndex = 0\n//#local gref_curDeviceName = \"\"\n//#while gref_curDeviceIndex<xml_size(gref_currentGameDevices)\n//#local gref_curDeviceElement = xml_get(gref_currentGameDevices,gref_curDeviceIndex)\n//#local gref_curDeviceElementName = xml_name(gref_curDeviceElement)\n//#local gref_curDeviceFamily = xml_attr(gref_curDeviceElement,\"family\")\n//#local gref_curDeviceElementName = xml_get(xml_list(gref_devices,gref_curDeviceElementName),0)\n//#local gref_curDeviceFamily = xml_text(xml_get(xml_list(gref_curDeviceElementName,gref_curDeviceFamily),0))\n//#local gref_curDeviceElementName = xml_attr(gref_curDeviceElementName,\"name\")\n//#if gref_curDeviceElementName!=gref_curDeviceName\n//#local gref_curDeviceName = gref_curDeviceElementName\n//#if gref_curDeviceIndex!=0\n<br>\n//#endif\n<div class=\"devicename\">/*$str2web(gref_curDeviceName)$*/</div>\n//#endif          \n<div class=\"devicelist\">/*$gref_curDeviceFamily$*/</div>\n//#local gref_curDeviceIndex = gref_curDeviceIndex+1    \n//#end          \n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">/*$gref_currentGameTitle$*/<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n//#if strlen(gref_currentGameScreens)>0\n//#local gref_curScreenLimit = str2int(gref_currentGameScreens)\n//#else\n//#local gref_curScreenLimit = 3\n//#endif\n\n//#local gref_curScreenIndex = 1\n//#while gref_curScreenIndex<=gref_curScreenLimit \n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"/*$\"../games/\"+gref_currentGameID+\"_scr\"+gref_curScreenIndex+\".gif\"$*/\"></div></td>\n//#local gref_curScreenIndex = gref_curScreenIndex+1\n//#end\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>/*$gref_currentGameReference$*/</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n//#if gref_curLangID==\"rus\"\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n//#else\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n//#endif\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n//#if gref_curLangID==\"rus\"\n&#1048;&#1084;&#1103;:\n//#else\nName:\n//#endif\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n//#if gref_curLangID==\"rus\"\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n//#else\nMessage:\n//#endif\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"/*$gref_currentGameTitle+\"(\"+gref_currentGameID+\")\"$*/\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n//#if gref_curLangID==\"rus\"\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n//#else\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n//#endif\n          <br>\n//#if gref_curLangID==\"rus\"\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n//#else\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n//#endif\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n//#if gref_curLangID==\"rus\"\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n//#else\n          &nbsp;PURCHASE&nbsp;\n//#endif\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n//#local gref_curSalesIndex=0\n//#while gref_curSalesIndex<xml_size(gref_currentSalesList)\n//#local gref_curSalesItem = xml_get(gref_currentSalesList,gref_curSalesIndex)\n//#local gref_curChannel = xml_name(gref_curSalesItem)\n//#local gref_curSalesCost = xml_attr(gref_curSalesItem,\"cost\")\n//#local gref_curSalesProductpage = xml_attr(gref_curSalesItem,\"productpage\")\n//#local gref_curChannelLogo = xml_get(xml_list(gref_channelsList,gref_curChannel),0)\n//#local gref_curChannelName = xml_attr(gref_curChannelLogo,\"name\")\n//#local gref_curChannelLogo = xml_attr(gref_curChannelLogo,\"logo\")\n<a href=\"/*$gref_curSalesProductpage$*/\" target=\"_new\">\n<img src=\"/*$gref_curChannelLogo$*/\" border=\"0\" alt=\"/*$gref_curSalesCost$*/\">\n</a>\n//#local gref_curSalesIndex=gref_curSalesIndex+1\n//#end\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">/*$gref_curLangFooter$*/</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n//#flush\n//#local gref_curGameIndex = gref_curGameIndex+1\n//#end\n//#local gref_langIndex = gref_langIndex+1\n//#end\n//#outname \"null.txt\""
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/games/games2003_2006.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\n<title>Old mobile games (august 2003-march 2006)</title>\n</head>\n\n<body>\n<h1 align=\"center\">Old mobile games (august 2003 - march 2006) </h1>\n<h4>Summary team at the period </h4>\n<p><em><strong>Producing: </strong></em>Arteom Litvinov, Igor Maznitsa <br>\n<em><strong>Project management: </strong></em>Igor Maznitsa<br>\n<em><strong>Project coordination: </strong></em>Aleksey Goryachev<br>\n<em><strong>Game design:</strong></em> Aleksey Goryachev, Igor Maznitsa<br>\n<em><strong>Level design:</strong></em> Aleksey Goryachev<br>\n  <em><strong>Programming:</strong></em> Alexander Vasiliev, Denis Parinov, Sergey Kuligin, Denis Rozhnev, Igor Maznitsa<br>\n<em><strong>Art:</strong></em> Svetlana Semenova, Andrey Diakov, Dmitriy Semenov, Igor Maznitsa <br>\n  <em><strong>Sound:</strong></em> Igor Maznitsa <br>\n<em><strong>Testing: </strong></em>Aleksey Goryachev</p>\n<hr>\n<p>-----------------------------</p>\n<p><strong>1. Papanin's quest</strong></p>\n<p><img src=\"papaninsquest_splash.jpg\" width=\"100\" height=\"118\">\n  <img src=\"papaninsquest_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"papaninsquest_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"papaninsquest_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>2. Air Aggression</strong></p>\n<p><img src=\"airaggression_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"airaggression_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"airaggression_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"airaggression_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>3. Kalah</strong></p>\n<p><img src=\"kalah_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"kalah_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"kalah_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"kalah_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>4. Mobile chase</strong></p>\n<p><img src=\"mobilechase_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"mobilechase_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"mobilechase_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"mobilechase_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>5. Caspian monster</strong></p>\n<p><img src=\"caspianmonster_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"caspianmonster_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"caspianmonster_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"caspianmonster_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>6. Hunt</strong></p>\n<p><img src=\"hunt_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"hunt_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"hunt_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"hunt_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>7. Raven's cheese</strong></p>\n<p><img src=\"ravenscheese_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"ravenscheese_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"ravenscheese_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"ravenscheese_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>8. Sea road</strong></p>\n<p><img src=\"searoad_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"searoad_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"searoad_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"searoad_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>9. Blazing gears</strong></p>\n<p><img src=\"blazinggears_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"blazinggears_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"blazinggears_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"blazinggears_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>10. Castle assault</strong></p>\n<p><img src=\"castleassault_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"castleassault_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"castleassault_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"castleassault_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>11. Cockroach</strong></p>\n<p><img src=\"cockroach_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"cockroach_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"cockroach_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"cockroach_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>12. Coconuts fall</strong></p>\n<p><img src=\"coconutsfall_splash.jpg\" width=\"100\" height=\"100\">  <img src=\"coconutsfall_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"coconutsfall_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"coconutsfall_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>13. Cone! Cone!</strong></p>\n<p> <img src=\"conecone_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"conecone_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"conecone_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"conecone_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>14. Firing line</strong></p>\n<p><img src=\"firingline_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"firingline_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"firingline_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"firingline_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>15. Fruit mania</strong></p>\n<p><img src=\"fruitmania_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"fruitmania_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"fruitmania_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"fruitmania_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>16. Hard day</strong></p>\n<p><img src=\"hardday_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"hardday_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"hardday_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"hardday_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>17. Ice gifts</strong></p>\n<p><img src=\"icegifts_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"icegifts_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"icegifts_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"icegifts_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>18. Iron stream</strong></p>\n<p><img src=\"ironstream_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"ironstream_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"ironstream_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"ironstream_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>19. Kick Kick</strong></p>\n<p><img src=\"kickkick_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"kickkick_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"kickkick_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"kickkick_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>20. Lifesaver</strong></p>\n<p><img src=\"lifesaver_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"lifesaver_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"lifesaver_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"lifesaver_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>21. Live bridge</strong></p>\n<p><img src=\"livebridge_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"livebridge_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"livebridge_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"livebridge_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>22. Mobile sheriff</strong></p>\n<p><img src=\"mobilesheriff_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"mobilesheriff_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"mobilesheriff_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"mobilesheriff_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>23. Paparazzo</strong></p>\n<p><img src=\"mtvpaparazzo_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"mtvpaparazzo_scr1.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpaparazzo_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpaparazzo_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>24. Pillow war</strong></p>\n<p><img src=\"mtvpillow_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"mtvpillow_scr1.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpillow_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpillow_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>25. MTV Puzzle</strong></p>\n<p><img src=\"mtvpuzzle_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"mtvpuzzle_scr1.gif\" width=\"174\" height=\"204\"> <img src=\"mtvpuzzle_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpuzzle_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>26. Scene</strong></p>\n<p><img src=\"mtvstage_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"mtvstage_scr1.gif\" width=\"176\" height=\"204\"> <img src=\"mtvstage_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvstage_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>27. Nimble</strong></p>\n<p><img src=\"nimble_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"nimble_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"nimble_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"nimble_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>28. Operation &quot;Thunderclap&quot;</strong></p>\n<p> <img src=\"opthunderclap_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"opthunderclap_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"opthunderclap_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"opthunderclap_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>29. Oyster bank</strong></p>\n<p><img src=\"oysterbank_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"oysterbank_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"oysterbank_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"oysterbank_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>30. Sea rovers</strong></p>\n<p><img src=\"searovers_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"searovers_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"searovers_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"searovers_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>31. Smashing kick</strong></p>\n<p><img src=\"smashingkick_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"smashingkick_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"smashingkick_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"smashingkick_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>32. Spiders</strong></p>\n<p><img src=\"spiders_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"spiders_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"spiders_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"spiders_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>33. Star harbor</strong></p>\n<p><img src=\"starharbor_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"starharbor_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"starharbor_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"starharbor_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>34. Strange Hunt</strong></p>\n<p><img src=\"strangehunt_splash.jpg\" width=\"100\" height=\"110\"> <img src=\"strangehunt_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"strangehunt_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"strangehunt_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>35. Tasty dish</strong></p>\n<p><img src=\"tastydish_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"tastydish_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"tastydish_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"tastydish_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>36. Vineyard</strong></p>\n<p><img src=\"vineyard_splash.jpg\" width=\"100\" height=\"110\"> <img src=\"vineyard_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"vineyard_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"vineyard_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>37. Waterway</strong></p>\n<p><img src=\"waterway_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"waterway_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"waterway_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"waterway_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>38. Wild balls</strong></p>\n<p><img src=\"wildballs_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"wildballs_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"wildballs_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"wildballs_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>39. Wild road</strong></p>\n<p><img src=\"wildroad_splash.jpg\" width=\"100\" height=\"110\"> <img src=\"wildroad_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"wildroad_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"wildroad_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>40. Copter bomber</strong></p>\n<p><img src=\"copterbomber_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"copterbomber_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"copterbomber_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"copterbomber_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>41. Drunkman</strong></p>\n<p><img src=\"drunkman_splash.jpg\" width=\"100\" height=\"99\"> <img src=\"drunkman_scr1.gif\" width=\"173\" height=\"179\"> <img src=\"drunkman_scr2.gif\" width=\"173\" height=\"178\"> <img src=\"drunkman_scr3.gif\" width=\"173\" height=\"178\"></p>\n<p>-----------------------------</p>\n<p><strong>42. Fisher</strong></p>\n<p><img src=\"fisher_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"fisher_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"fisher_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"fisher_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>43. Air boil</strong></p>\n<p><img src=\"airboil_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"airboil_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"airboil_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"airboil_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>&nbsp;</p>\n</body>\n</html>"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/games.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body>\n//#+\n<p align=\"center\"><strong><em><font size=\"4\">Sorry, but the page is still under \n  construction....</font></em></strong></p>\n<p align=\"center\"><img src=\"../undercon.gif\" width=\"40\" height=\"38\"></p>\n<p align=\"center\"><strong><font size=\"4\"><em>Visit us later, please...</em></font></strong></p>\n\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/games.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<data>\n\t<channels>\n\t\t<simone name=\"SIMONE\" logo=\"../logos/simone.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1050;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;</rus>\n\t\t   \t\t<eng>A content provider</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.simone.ru</web>\n\t\t\t   <wap>http://wap.simone.ru</wap>\n\t\t\t</link>\n\t\t</simone>\n\t\t<muzon name=\"MUZON.RU\" logo=\"../logos/muzon.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1052;&#1077;&#1083;&#1086;&#1076;&#1080;&#1080;, &#1080;&#1075;&#1088;&#1099; &#1080; &#1083;&#1086;&#1075;&#1086;&#1090;&#1080;&#1087;&#1099; &#1076;&#1083;&#1103; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1099;&#1093; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1086;&#1074;.</rus>\n\t\t   \t\t<eng>Ringtones, games and logos for mobile phones.</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.muzon.ru</web>\n\t\t\t   <wap>http://wap.muzon.ru</wap>\n\t\t\t</link>\n\t\t</muzon>\n\t\t<ringtime name=\"RINGTIME(R)\" logo=\"../logos/ringtime.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1052;&#1077;&#1083;&#1086;&#1076;&#1080;&#1080;, &#1080;&#1075;&#1088;&#1099; &#1080; &#1083;&#1086;&#1075;&#1086;&#1090;&#1080;&#1087;&#1099; &#1076;&#1083;&#1103; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1099;&#1093; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1086;&#1074;.</rus>\n\t\t   \t\t<eng>Ringtones, games and logos for mobile phones.</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.ringtime.ru</web>\n\t\t\t   <wap>http://wap.muzon.ru</wap>\n\t\t\t</link>\n\t\t</ringtime>\n\t\t<cellcasino name=\"CELLCASINO.RU\" logo=\"../logos/cellcasino.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1040;&#1079;&#1072;&#1088;&#1090;&#1085;&#1099;&#1077; &#1080;&#1075;&#1088;&#1099; &#1085;&#1072; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1086;&#1084; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1077;, &#1085;&#1072; &#1088;&#1077;&#1072;&#1083;&#1100;&#1085;&#1099;&#1077; &#1076;&#1077;&#1085;&#1100;&#1075;&#1080;.</rus>\n\t\t   \t\t<eng>Gambling games on cell phones on real money.</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.cellcasino.ru</web>\n\t\t\t</link>\n\t\t</cellcasino>\n        <nikita name=\"NIKITA\" logo=\"../logos/nikita.gif\">\n    \t    <name>NIKITA</name>\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1050;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;</rus>\n\t\t   \t\t<eng>A content provider</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.nikita.ru</web>\n\t\t\t   <wap>http://wap.nikita.ru</wap>\n\t\t\t</link>\n\t\t</nikita>\n        <infon name=\"INFON(R)\" logo=\"../logos/infon.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1050;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;</rus>\n\t\t   \t\t<eng>A content provider</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.infon.ru</web>\n\t\t\t   <wap>http://wap.infon.ru</wap>\n\t\t\t</link>\n\t\t</infon>\n        <playmobile name=\"Playmobile(TM)\" logo=\"../logos/playmobile.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1050;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;</rus>\n\t\t   \t\t<eng>A content provider</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.playmobile.ru</web>\n\t\t\t   <wap>http://wap.playmobile.ru</wap>\n\t\t\t</link>\n\t\t</playmobile>\n\t</channels>\n\t\n\t<owners>\n\t\t<coldcore link=\"http://www.coldcore.ru\">ColdCore(R)</coldcore>\t\n        <siemensmobile link=\"http://www.siemens-mobile.ru\">Siemens mobile</siemensmobile> \n        <samsungfunclub link=\"http://ru.samsungmobile.com\">SAMSUNG FunClub</samsungfunclub> \n        <mtv link=\"http://www.mtv.ru\">MTV</mtv> \n        <akumiitti link=\"http://www.akumiitti.com\">Akumiitti Oy</akumiitti> \n        <infon link=\"http://www.infon.ru\">INFON</infon>\n        <gamefederation link=\"http://www.gamefederation.com\">Gamefederation</gamefederation>  \n        <cellcasino link=\"http://www.cellcasino.ru\">CellCasino</cellcasino>  \n        <ringtime link=\"http://www.ringtime.ru\">Ringtime(R)</ringtime>  \n\t</owners>\n\t\n\n\t<games>\n\n    <game id=\"aneks_ny2006\"  title=\"The collection 'New Year's jokes'\" year=\"2005\">\n\t    <appsall/>\n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1057;&#1073;&#1086;&#1088;&#1085;&#1080;&#1082; \"&#1053;&#1054;&#1042;&#1054;&#1043;&#1054;&#1044;&#1053;&#1048;&#1045; &#1040;&#1053;&#1045;&#1050;&#1044;&#1054;&#1058;&#1067;\", &#1089;&#1086;&#1076;&#1077;&#1088;&#1078;&#1080;&#1090; 60 &#1086;&#1090;&#1073;&#1086;&#1088;&#1085;&#1099;&#1093; &#1053;&#1086;&#1074;&#1086;&#1075;&#1086;&#1076;&#1085;&#1080;&#1093; &#1080;&#1089;&#1090;&#1086;&#1088;&#1080;&#1081;.</rus>\n           <eng>The collection \"New Year's jokes\" contains 60 jokes.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1103;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1089;&#1073;&#1086;&#1088;&#1085;&#1080;&#1082;&#1086;&#1084; &#1085;&#1086;&#1074;&#1086;&#1075;&#1086;&#1076;&#1085;&#1080;&#1093; &#1072;&#1085;&#1077;&#1082;&#1076;&#1086;&#1090;&#1086;&#1074;, &#1088;&#1072;&#1089;&#1089;&#1086;&#1088;&#1090;&#1080;&#1088;&#1086;&#1074;&#1072;&#1085;&#1085;&#1099;&#1093; &#1087;&#1086; &#1090;&#1077;&#1084;&#1072;&#1084;. &#1042; &#1089;&#1073;&#1086;&#1088;&#1085;&#1080;&#1082; &#1074;&#1086;&#1096;&#1083;&#1086; 60 &#1072;&#1085;&#1077;&#1082;&#1076;&#1086;&#1090;&#1086;&#1074;.</rus>\n           <eng>The application is a collection of jokes, the jokes are sorted on themes. The collection included 60 jokes.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t\t<infon productpage=\"http://www.infon.ru/games.phtml?gid=468361\" cost=\"2.5$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series40dp2b\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2a\"/>\n            <nokia family=\"series60dp2c\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group1\"/>\n            <samsung family=\"group2\"/>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n            <samsung family=\"group6a\"/>\n            <samsung family=\"group6b\"/>\n            <samsung family=\"group7\"/>\n            <samsung family=\"group8\"/>\n            <samsung family=\"group9\"/>\n            <samsung family=\"group10\"/>\n            <samsung family=\"group11\"/>\n            <samsung family=\"group12a\"/>\n            <samsung family=\"group12b\"/>\n            <samsung family=\"group12c\"/>\n            <samsung family=\"group13\"/>\n            <samsung family=\"group14\"/>\n            <samsung family=\"group15a\"/>\n            <samsung family=\"group15b\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n    <game id=\"slider_alpop\"  title=\"Slider 'Aleosha Popovich'\" year=\"2005\">\n\t    <appsall/>\n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1057;&#1083;&#1072;&#1081;&#1076;&#1077;&#1088; &#1087;&#1086; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1086;&#1084;&#1091; &#1084;&#1091;&#1083;&#1100;&#1090;&#1092;&#1080;&#1083;&#1100;&#1084;&#1091; \"&#1040;&#1083;&#1077;&#1096;&#1072; &#1055;&#1086;&#1087;&#1086;&#1074;&#1080;&#1095; &#1080; &#1058;&#1091;&#1075;&#1072;&#1088;&#1080;&#1085; &#1047;&#1084;&#1077;&#1081;\"</rus>\n           <eng>A slide-show of the cartoon film \"Aleosha Popovich and Toogarin Zmey\"</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1057;&#1083;&#1072;&#1081;&#1076;&#1077;&#1088; &#1089;&#1086;&#1076;&#1077;&#1088;&#1078;&#1080;&#1090; 10 &#1082;&#1072;&#1076;&#1088;&#1086;&#1074; &#1084;&#1091;&#1083;&#1100;&#1090;&#1092;&#1080;&#1083;&#1100;&#1084;&#1072; &#1089; &#1090;&#1077;&#1082;&#1089;&#1090;&#1086;&#1084; &#1082; &#1082;&#1072;&#1078;&#1076;&#1086;&#1084;&#1091; &#1082;&#1072;&#1076;&#1088;&#1091;. &#1045;&#1089;&#1090;&#1100; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1100; &#1087;&#1088;&#1086;&#1089;&#1084;&#1086;&#1090;&#1088;&#1072; &#1082;&#1072;&#1076;&#1088;&#1086;&#1074; &#1082;&#1072;&#1082; &#1074; &#1088;&#1091;&#1095;&#1085;&#1086;&#1084; &#1090;&#1072;&#1082; &#1080; &#1074; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1084; &#1088;&#1077;&#1078;&#1080;&#1084;&#1077;. &#1052;&#1086;&#1078;&#1085;&#1086; &#1091;&#1074;&#1077;&#1083;&#1080;&#1095;&#1080;&#1074;&#1072;&#1090;&#1100; &#1074;&#1099;&#1073;&#1088;&#1072;&#1085;&#1085;&#1099;&#1081; &#1082;&#1072;&#1076;&#1088; &#1080; &#1088;&#1072;&#1089;&#1089;&#1084;&#1072;&#1090;&#1088;&#1080;&#1074;&#1072;&#1090;&#1100; &#1086;&#1090;&#1076;&#1077;&#1083;&#1100;&#1085;&#1099;&#1077; &#1076;&#1077;&#1090;&#1072;&#1083;&#1080; &#1080;&#1079;&#1086;&#1073;&#1088;&#1072;&#1078;&#1077;&#1085;&#1080;&#1103;.</rus>\n           <eng>The slide-show contains 10 frames (with texts) from the cartoon film \"Aleosha Popovich and Toogarin Zmey\". You can view the frames in both automatic and manual modes  as well  you can magnify selected frame and consider it.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series40dp2b\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group5\"/>\n            <samsung family=\"group4\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n    <game id=\"smscat\"  title=\"SMS Catalog\" year=\"2005\">\n\t    <appsall/>\n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1069;&#1083;&#1077;&#1082;&#1090;&#1088;&#1086;&#1085;&#1085;&#1099;&#1081; &#1082;&#1072;&#1090;&#1072;&#1083;&#1086;&#1075; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;&#1072; &#1089; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1100;&#1102; &#1079;&#1072;&#1082;&#1072;&#1079;&#1072; &#1080; &#1086;&#1073;&#1085;&#1086;&#1074;&#1083;&#1077;&#1085;&#1080;&#1103; &#1095;&#1077;&#1088;&#1077;&#1079; WAP.</rus>\n           <eng>A mobile catalog of mobile content enables to send SMS for order and can be upgraded via WAP.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1099;&#1081; &#1082;&#1072;&#1090;&#1072;&#1083;&#1086;&#1075; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;&#1072;, &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1102;&#1097;&#1080;&#1081; &#1087;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1102; &#1086;&#1079;&#1085;&#1072;&#1082;&#1086;&#1084;&#1080;&#1090;&#1100;&#1089;&#1103; &#1089; &#1089;&#1086;&#1089;&#1090;&#1072;&#1074;&#1086;&#1084; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;&#1072; &#1074; &#1073;&#1072;&#1079;&#1077; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090; &#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;&#1072; &#1080;, &#1077;&#1089;&#1083;&#1080; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085; &#1080;&#1084;&#1077;&#1077;&#1090; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1100;, &#1086;&#1089;&#1091;&#1097;&#1077;&#1089;&#1090;&#1074;&#1080;&#1090;&#1100; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1082;&#1091; SMS &#1085;&#1072; &#1085;&#1086;&#1084;&#1077;&#1088; &#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;&#1072; &#1089; &#1094;&#1077;&#1083;&#1100;&#1102; &#1079;&#1072;&#1082;&#1072;&#1079;&#1072; &#1087;&#1086;&#1085;&#1088;&#1072;&#1074;&#1080;&#1074;&#1096;&#1077;&#1075;&#1086;&#1089;&#1103; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;&#1072;. &#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1077;&#1090; &#1086;&#1088;&#1075;&#1072;&#1085;&#1080;&#1079;&#1086;&#1074;&#1099;&#1074;&#1072;&#1090;&#1100; &#1089;&#1083;&#1086;&#1078;&#1085;&#1091;&#1102; &#1076;&#1088;&#1077;&#1074;&#1086;&#1074;&#1080;&#1076;&#1085;&#1091;&#1102; &#1089;&#1090;&#1088;&#1091;&#1082;&#1090;&#1091;&#1088;&#1091; &#1082;&#1072;&#1090;&#1072;&#1083;&#1086;&#1075;&#1072; &#1089; &#1074;&#1082;&#1083;&#1102;&#1095;&#1077;&#1085;&#1080;&#1077;&#1084; &#1080;&#1079;&#1086;&#1073;&#1088;&#1072;&#1078;&#1077;&#1085;&#1080;&#1081; &#1076;&#1083;&#1103; &#1087;&#1088;&#1077;&#1076;&#1087;&#1088;&#1086;&#1089;&#1084;&#1086;&#1090;&#1088;&#1072;, &#1080;&#1079;&#1086;&#1073;&#1088;&#1072;&#1078;&#1077;&#1085;&#1080;&#1103; &#1084;&#1086;&#1075;&#1091;&#1090; &#1093;&#1088;&#1072;&#1085;&#1080;&#1090;&#1100;&#1089;&#1103; &#1082;&#1072;&#1082; &#1089; &#1082;&#1072;&#1090;&#1072;&#1083;&#1086;&#1075;&#1086;&#1084; &#1090;&#1072;&#1082; &#1080; &#1073;&#1099;&#1090;&#1100; &#1079;&#1072;&#1075;&#1088;&#1091;&#1078;&#1077;&#1085;&#1085;&#1099;&#1084;&#1080; &#1095;&#1077;&#1088;&#1077;&#1079; &#1089;&#1077;&#1090;&#1100;. &#1055;&#1086;&#1076;&#1076;&#1077;&#1088;&#1078;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; &#1090;&#1088;&#1080; &#1089;&#1093;&#1077;&#1084;&#1099; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1082;&#1080; SMS: Siemens, WMA &#1080; Samsung. &#1071;&#1079;&#1099;&#1082; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1103; &#1088;&#1091;&#1089;&#1089;&#1082;&#1080;&#1081;, &#1087;&#1088;&#1080; &#1080;&#1085;&#1086;&#1084; &#1103;&#1079;&#1099;&#1082;&#1077;, &#1091;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1083;&#1077;&#1085;&#1085;&#1086;&#1084; &#1085;&#1072; &#1072;&#1087;&#1087;&#1072;&#1088;&#1072;&#1090;&#1077; &#1087;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1103;, &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1086;&#1090;&#1086;&#1073;&#1088;&#1072;&#1078;&#1072;&#1077;&#1090; &#1090;&#1077;&#1082;&#1089;&#1090; &#1090;&#1088;&#1072;&#1085;&#1089;&#1083;&#1080;&#1090;&#1086;&#1084;. &#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1076;&#1080;&#1085;&#1072;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1087;&#1086;&#1076;&#1089;&#1090;&#1088;&#1072;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; &#1087;&#1086;&#1076; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1080; &#1072;&#1087;&#1087;&#1072;&#1088;&#1072;&#1090;&#1072; &#1080; &#1084;&#1086;&#1078;&#1077;&#1090; &#1088;&#1072;&#1073;&#1086;&#1090;&#1072;&#1090;&#1100; &#1085;&#1072; &#1083;&#1102;&#1073;&#1086;&#1084; &#1072;&#1087;&#1087;&#1072;&#1088;&#1072;&#1090;&#1077; &#1089; &#1087;&#1083;&#1072;&#1090;&#1092;&#1086;&#1088;&#1084;&#1086;&#1081; &#1085;&#1077; &#1085;&#1080;&#1078;&#1077; MIDP-1.0. &#1057;&#1087;&#1080;&#1089;&#1086;&#1082; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1077;&#1081; &#1086;&#1073;&#1086;&#1083;&#1086;&#1095;&#1082;&#1080; &#1087;&#1088;&#1077;&#1074;&#1099;&#1096;&#1072;&#1077;&#1090; 20 &#1087;&#1091;&#1085;&#1082;&#1090;&#1086;&#1074;.</rus>\n           <eng>The mobile catalog enables to a user to look through contents of a mobile content provider's base and to order liked content with automatically generated SMS (if the device is supporting). The application supports three SMS schemes: Siemens, Samsung and WMA. The application enables to organize complicated tree-structured catalogs. It can be started on any device supports MIDP-1.0 or older.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30bw\"/>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series40dp2b\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series45a\"/>\n            <siemens family=\"series45b\"/>\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\t\n\t<game id=\"fruitmania\"  title=\"FRUITMANIA\" year=\"2005\">\n        <all/>\n\t\t<gambling/>\n\t\t<clientserver/>\n\t\t\t    \n\t    <owner id=\"cellcasino\"/>\n\n        <shortreference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; \"&#1054;&#1076;&#1085;&#1086;&#1088;&#1091;&#1082;&#1086;&#1075;&#1086; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1072;\", &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1102;&#1097;&#1072;&#1103; &#1080;&#1075;&#1088;&#1072;&#1090;&#1100; &#1085;&#1072; &#1088;&#1077;&#1072;&#1083;&#1100;&#1085;&#1099;&#1077; &#1076;&#1077;&#1085;&#1100;&#1075;&#1080;.</rus>\n           <eng>Mobile version of the \"Fruitmania\" casino game enables to play on real money.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1086;&#1075;&#1086; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1072; \"&#1054;&#1076;&#1085;&#1086;&#1088;&#1091;&#1082;&#1080;&#1081; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;\", &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1102;&#1097;&#1072;&#1103; &#1076;&#1077;&#1083;&#1072;&#1090;&#1100; &#1089;&#1090;&#1072;&#1074;&#1082;&#1091; &#1089; &#1088;&#1077;&#1072;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1089;&#1095;&#1077;&#1090;&#1072; &#1074; &#1082;&#1072;&#1079;&#1080;&#1085;&#1086; &#1080; &#1086;&#1089;&#1091;&#1097;&#1077;&#1089;&#1090;&#1074;&#1083;&#1103;&#1090;&#1100; &#1080;&#1075;&#1088;&#1091; &#1095;&#1077;&#1088;&#1077;&#1079; &#1080;&#1085;&#1090;&#1077;&#1088;&#1085;&#1077;&#1090; &#1089; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1072;, &#1074;&#1099;&#1080;&#1075;&#1088;&#1099;&#1074;&#1072;&#1103; &#1088;&#1077;&#1072;&#1083;&#1100;&#1085;&#1099;&#1077; &#1076;&#1077;&#1085;&#1100;&#1075;&#1080;.</rus>\n           <eng>A mobile version of well-known casino game enables to make bet from real casino account and to play via internet from your mobile devices. You can win real money with the game.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesE398\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"strangehunt\"  title=\"STRANGE HUNT\" year=\"2006\">\n        <all/>\n\t\t<shooter/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1058;&#1077;&#1073;&#1103; &#1079;&#1072;&#1085;&#1077;&#1089;&#1083;&#1086; &#1085;&#1072; &#1074;&#1086;&#1077;&#1085;&#1085;&#1099;&#1081; &#1087;&#1086;&#1083;&#1080;&#1075;&#1086;&#1085;, &#1085;&#1086; &#1085;&#1077; &#1089;&#1076;&#1072;&#1074;&#1072;&#1081;&#1089;&#1103;!</rus>\n           <eng>You have come on military range but do not surrender!</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1058;&#1077;&#1073;&#1103; &#1079;&#1072;&#1085;&#1077;&#1089;&#1083;&#1086; &#1085;&#1072; &#1074;&#1086;&#1077;&#1085;&#1085;&#1099;&#1081; &#1087;&#1086;&#1083;&#1080;&#1075;&#1086;&#1085;, &#1085;&#1086; &#1085;&#1077; &#1089;&#1076;&#1072;&#1074;&#1072;&#1081;&#1089;&#1103;! &#1053;&#1077;&#1089;&#1084;&#1086;&#1090;&#1088;&#1103; &#1085;&#1072; &#1090;&#1088;&#1091;&#1076;&#1085;&#1086;&#1089;&#1090;&#1080;, &#1085;&#1072;&#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1081; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1091;&#1090;&#1086;&#1082; &#1080; &#1082;&#1072;&#1073;&#1072;&#1085;&#1086;&#1074;!</rus>\n           <eng>You have come on military range but do not surrender! Shoot as many as possible ducks and wild boars!</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"icegifts\"  title=\"ICE GIFTS\" year=\"2006\">\n        <all/>\n\t\t<logic/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1055;&#1086;&#1084;&#1086;&#1075;&#1080; &#1076;&#1077;&#1076;&#1091; &#1052;&#1086;&#1088;&#1086;&#1079;&#1091; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100; &#1074;&#1089;&#1077; &#1053;&#1086;&#1074;&#1086;&#1075;&#1086;&#1076;&#1085;&#1080;&#1077; &#1087;&#1086;&#1076;&#1072;&#1088;&#1082;&#1080;.</rus>\n           <eng>Help Santa to send all XMas gifts.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1055;&#1086;&#1084;&#1086;&#1075;&#1080; &#1076;&#1077;&#1076;&#1091; &#1052;&#1086;&#1088;&#1086;&#1079;&#1091; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100; &#1074;&#1089;&#1077; &#1053;&#1086;&#1074;&#1086;&#1075;&#1086;&#1076;&#1085;&#1080;&#1077; &#1087;&#1086;&#1076;&#1072;&#1088;&#1082;&#1080;. &#1057;&#1086;&#1074;&#1084;&#1077;&#1097;&#1072;&#1081; &#1080;&#1093; &#1086;&#1076;&#1080;&#1085;&#1072;&#1082;&#1086;&#1074;&#1099;&#1084;&#1080; &#1089;&#1090;&#1086;&#1088;&#1086;&#1085;&#1072;&#1084;&#1080; &#1080; &#1085;&#1077; &#1076;&#1086;&#1087;&#1091;&#1089;&#1082;&#1072;&#1081; &#1086;&#1090;&#1089;&#1091;&#1090;&#1089;&#1090;&#1074;&#1080;&#1103; &#1087;&#1091;&#1089;&#1090;&#1099;&#1093; &#1087;&#1088;&#1086;&#1088;&#1091;&#1073;&#1077;&#1081; &#1076;&#1083;&#1103; &#1085;&#1086;&#1074;&#1099;&#1093; &#1087;&#1086;&#1076;&#1072;&#1088;&#1082;&#1086;&#1074;.</rus>\n           <eng>Help Santa to send all XMas gifts. Combine their identical parties and do not suppose absence of empty ice-holes for new gifts.</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t\n\t\t<game id=\"wildroad\"  title=\"WILD ROAD\" year=\"2006\">\n        <all/>\n\t\t<arcade/>\n\t\t<racing/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1072; &#1074; &#1089;&#1090;&#1080;&#1083;&#1077; &#1041;&#1077;&#1079;&#1091;&#1084;&#1085;&#1099;&#1081; &#1052;&#1072;&#1082;&#1089;. &#1059;&#1081;&#1076;&#1080; &#1086;&#1090; &#1087;&#1086;&#1075;&#1086;&#1085;&#1080; &#1080; &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1081; &#1082;&#1072;&#1085;&#1080;&#1089;&#1090;&#1088;&#1099;.</rus>\n           <eng>Break away from persecutors, do not allow them to destroy your car.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1054;&#1090;&#1086;&#1088;&#1074;&#1080;&#1089;&#1100; &#1086;&#1090; &#1087;&#1088;&#1077;&#1089;&#1083;&#1077;&#1076;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1077;&#1081;, &#1085;&#1077; &#1076;&#1072;&#1081; &#1080;&#1084; &#1087;&#1086;&#1076;&#1086;&#1088;&#1074;&#1072;&#1090;&#1100; &#1090;&#1074;&#1086;&#1102; &#1084;&#1072;&#1096;&#1080;&#1085;&#1091; &#1080;&#1083;&#1080; &#1087;&#1088;&#1099;&#1075;&#1085;&#1091;&#1090;&#1100; &#1085;&#1072; &#1085;&#1077;&#1105;. &#1055;&#1086;&#1076;&#1073;&#1080;&#1088;&#1072;&#1081; &#1082;&#1072;&#1085;&#1080;&#1089;&#1090;&#1088;&#1099;, &#1090;&#1072;&#1082; &#1082;&#1072;&#1082; &#1090;&#1086;&#1087;&#1083;&#1080;&#1074;&#1086; &#1087;&#1086;&#1089;&#1090;&#1086;&#1103;&#1085;&#1085;&#1086; &#1074;&#1099;&#1090;&#1077;&#1082;&#1072;&#1077;&#1090; &#1095;&#1077;&#1088;&#1077;&#1079; &#1087;&#1088;&#1086;&#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1085;&#1085;&#1099;&#1077; &#1073;&#1072;&#1082;&#1080;.</rus>\n           <eng>Break away from persecutors, do not allow them to destroy your car or to jump on it. Pick up jerricans because fuel constantly drips out through the raked tanks.</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"vineyard\"  title=\"VINEYARD\" year=\"2006\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1055;&#1088;&#1080;&#1096;&#1083;&#1072; &#1087;&#1086;&#1088;&#1072; &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1090;&#1100; &#1074;&#1080;&#1085;&#1086;&#1075;&#1088;&#1072;&#1076;, &#1085;&#1086; &#1079;&#1083;&#1086;&#1073;&#1085;&#1099;&#1077; &#1091;&#1083;&#1080;&#1090;&#1082;&#1080;-&#1084;&#1091;&#1090;&#1072;&#1085;&#1090;&#1099; &#1085;&#1077; &#1089;&#1087;&#1103;&#1090;.</rus>\n           <eng>It is the time to collect grapes but evil snails can prevent it.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1057;&#1086;&#1073;&#1080;&#1088;&#1072;&#1081;&#1090;&#1077; &#1074;&#1080;&#1085;&#1086;&#1075;&#1088;&#1072;&#1076; &#1080; &#1088;&#1072;&#1089;&#1082;&#1083;&#1072;&#1076;&#1099;&#1074;&#1072;&#1081;&#1090;&#1077; &#1077;&#1075;&#1086; &#1074; &#1082;&#1086;&#1088;&#1079;&#1080;&#1085;&#1099;, &#1087;&#1077;&#1088;&#1077;&#1093;&#1086;&#1076; &#1085;&#1072; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1081; &#1091;&#1088;&#1086;&#1074;&#1077;&#1085;&#1100; &#1082;&#1086;&#1075;&#1076;&#1072; &#1074;&#1089;&#1077; &#1082;&#1086;&#1088;&#1079;&#1080;&#1085;&#1099; &#1079;&#1072;&#1087;&#1086;&#1083;&#1085;&#1077;&#1085;&#1099;. &#1053;&#1077; &#1087;&#1086;&#1087;&#1072;&#1076;&#1072;&#1081;&#1090;&#1077;&#1089;&#1100; &#1091;&#1083;&#1080;&#1090;&#1082;&#1072;&#1084;!</rus>\n           <eng>Gather grapes and put its into mollies, you must collect all grapes to pass a game level. You must avoid collisions with snails!</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"copterbomber\"  title=\"COPTER BOMBER\" year=\"2006\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1100; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072; &#1087;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1085;&#1086;&#1074;&#1086;&#1075;&#1086; &#1089;&#1091;&#1087;&#1077;&#1088;&#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072;.</rus>\n           <eng>Destroy all enemy tanks and buildings with new supercoter.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1087;&#1080;&#1083;&#1086;&#1090; &#1089;&#1077;&#1082;&#1088;&#1077;&#1090;&#1085;&#1086;&#1075;&#1086; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072;-&#1073;&#1086;&#1084;&#1073;&#1072;&#1088;&#1076;&#1080;&#1088;&#1086;&#1074;&#1097;&#1080;&#1082;&#1072;, &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1100;&#1090;&#1077; &#1074;&#1089;&#1077; &#1074;&#1088;&#1072;&#1078;&#1077;&#1089;&#1082;&#1080;&#1077; &#1094;&#1077;&#1083;&#1080; &#1080; &#1085;&#1077; &#1089;&#1090;&#1072;&#1083;&#1082;&#1080;&#1074;&#1072;&#1081;&#1090;&#1077;&#1089;&#1100; &#1089; &#1074;&#1086;&#1079;&#1076;&#1091;&#1096;&#1085;&#1099;&#1084; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1086;&#1084;.</rus>\n           <eng>You are a pilot of a top secret copter-bomber and your task is to destroy all enemy ground targets. You must avoid collisions with flying enemies.</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"drunkman\"  title=\"TIPPLER\" year=\"2006\">\n        <all/>\n\t\t<gambling/>\n\t\t<erotic/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1082;&#1072;&#1088;&#1090;&#1086;&#1095;&#1085;&#1086;&#1081; &#1080;&#1075;&#1088;&#1099; &#1055;&#1068;&#1071;&#1053;&#1048;&#1062;&#1040; &#1085;&#1072; &#1088;&#1072;&#1079;&#1076;&#1077;&#1074;&#1072;&#1085;&#1080;&#1077;.</rus>\n           <eng>A mobile version of the card game TIPPLER.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1082;&#1072;&#1088;&#1090;&#1086;&#1095;&#1085;&#1086;&#1081; &#1080;&#1075;&#1088;&#1099; &#1055;&#1068;&#1071;&#1053;&#1048;&#1062;&#1040;. &#1048;&#1075;&#1088;&#1072; &#1085;&#1072; &#1088;&#1072;&#1079;&#1076;&#1077;&#1074;&#1072;&#1085;&#1080;&#1077; &#1089; &#1090;&#1088;&#1077;&#1084;&#1103; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;&#1084;&#1080;.</rus>\n           <eng>A mobile version of the TIPPLER card game. You can select one from three opponents and to play with it for undressing.</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"airboil\"  title=\"AIR BOIL\" year=\"2005\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1054;&#1089;&#1074;&#1086;&#1073;&#1086;&#1076;&#1080; &#1078;&#1080;&#1090;&#1077;&#1083;&#1077;&#1081; &#1076;&#1072;&#1083;&#1077;&#1082;&#1086;&#1081; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1099; &#1086;&#1090; &#1075;&#1086;&#1089;&#1087;&#1086;&#1076;&#1089;&#1090;&#1074;&#1072; &#1084;&#1072;&#1096;&#1080;&#1085;.</rus>\n           <eng>Release a distant planet from machines' domination.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042; 2050 &#1075;&#1086;&#1076;&#1091;, &#1073;&#1099;&#1083;&#1072; &#1086;&#1073;&#1085;&#1072;&#1088;&#1091;&#1078;&#1077;&#1085;&#1072; &#1086;&#1090;&#1076;&#1072;&#1083;&#1077;&#1085;&#1085;&#1072;&#1103; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1072; &#1089; &#1086;&#1095;&#1077;&#1085;&#1100; &#1085;&#1080;&#1079;&#1082;&#1086;&#1081; &#1075;&#1088;&#1072;&#1074;&#1080;&#1090;&#1072;&#1094;&#1080;&#1077;&#1081;. &#1046;&#1080;&#1090;&#1077;&#1083;&#1080; &#1101;&#1090;&#1086;&#1081; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1099; &#1086;&#1082;&#1072;&#1079;&#1072;&#1083;&#1080;&#1089;&#1100; &#1087;&#1086;&#1088;&#1072;&#1073;&#1086;&#1097;&#1077;&#1085;&#1099; &#1095;&#1077;&#1090;&#1099;&#1088;&#1100;&#1084;&#1103; &#1086;&#1075;&#1088;&#1086;&#1084;&#1085;&#1099;&#1084;&#1080; &#1084;&#1072;&#1096;&#1080;&#1085;&#1086;&#1087;&#1086;&#1076;&#1086;&#1073;&#1085;&#1099;&#1084;&#1080; &#1087;&#1088;&#1080;&#1096;&#1077;&#1083;&#1100;&#1094;&#1072;&#1084;&#1080;. &#1044;&#1077;&#1084;&#1086;&#1082;&#1088;&#1072;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1072;&#1103; &#1047;&#1077;&#1084;&#1083;&#1103; &#1085;&#1077; &#1089;&#1084;&#1086;&#1075;&#1083;&#1072; &#1089;&#1084;&#1080;&#1088;&#1080;&#1090;&#1100;&#1089;&#1103; &#1089; &#1090;&#1072;&#1082;&#1080;&#1084; &#1089;&#1086;&#1089;&#1090;&#1086;&#1103;&#1085;&#1080;&#1077;&#1081;&#1084; &#1076;&#1077;&#1083; &#1080; &#1082;&#1086;&#1089;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080;&#1081; &#1096;&#1072;&#1090;&#1090;&#1083; &#1076;&#1086;&#1089;&#1090;&#1072;&#1074;&#1080;&#1083; &#1085;&#1072; &#1101;&#1090;&#1091; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1091; &#1089;&#1091;&#1087;&#1077;&#1088;&#1089;&#1087;&#1077;&#1094;&#1085;&#1072;&#1079;&#1086;&#1074;&#1094;&#1072; &#1044;&#1078;&#1086;&#1085;&#1072; &#1055;&#1077;&#1090;&#1088;&#1086;&#1074;&#1072;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1080; &#1073;&#1099;&#1083; &#1089;&#1073;&#1088;&#1086;&#1096;&#1077;&#1085; &#1085;&#1072; &#1087;&#1086;&#1074;&#1077;&#1088;&#1093;&#1085;&#1086;&#1089;&#1090;&#1100; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1099; &#1074;&#1084;&#1077;&#1089;&#1090;&#1077; &#1089; &#1074;&#1077;&#1083;&#1086;&#1089;&#1080;&#1087;&#1077;&#1076;&#1086;&#1084; &#1080; &#1088;&#1072;&#1082;&#1077;&#1090;&#1085;&#1086;&#1081; &#1091;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1082;&#1086;&#1081; &#1076;&#1083;&#1103; &#1085;&#1072;&#1074;&#1077;&#1076;&#1077;&#1085;&#1080;&#1103; &#1076;&#1077;&#1084;&#1086;&#1082;&#1088;&#1072;&#1090;&#1080;&#1080; &#1080; &#1084;&#1086;&#1089;&#1090;&#1086;&#1074; &#1076;&#1088;&#1091;&#1078;&#1073;&#1099;. &#1048;&#1090;&#1072;&#1082;, &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1080;&#1075;&#1088;&#1072;&#1102;&#1097;&#1077;&#1075;&#1086; - &#1087;&#1088;&#1086;&#1081;&#1090;&#1080; 20 &#1091;&#1088;&#1086;&#1074;&#1085;&#1077;&#1081; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1072;&#1103; &#1088;&#1072;&#1079;&#1083;&#1080;&#1095;&#1085;&#1091;&#1102; &#1083;&#1077;&#1090;&#1072;&#1102;&#1097;&#1091;&#1102; &#1085;&#1077;&#1095;&#1080;&#1089;&#1090;&#1100; &#1080; &#1091;&#1082;&#1083;&#1086;&#1085;&#1103;&#1103;&#1089;&#1100; &#1086;&#1090; &#1084;&#1077;&#1090;&#1077;&#1086;&#1088;&#1080;&#1090;&#1085;&#1099;&#1093; &#1076;&#1086;&#1078;&#1076;&#1077;&#1081;, &#1074;&#1077;&#1089;&#1100;&#1084;&#1072; &#1095;&#1072;&#1089;&#1090;&#1099;&#1093; &#1085;&#1072; &#1101;&#1090;&#1086;&#1081; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1077;. &#1048;&#1075;&#1088;&#1086;&#1074;&#1099;&#1077; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1080; &#1084;&#1086;&#1078;&#1085;&#1086; &#1087;&#1086;&#1087;&#1086;&#1083;&#1085;&#1103;&#1090;&#1100;, &#1087;&#1086;&#1076;&#1073;&#1080;&#1088;&#1072;&#1103; &#1087;&#1072;&#1076;&#1072;&#1102;&#1097;&#1080;&#1077; &#1087;&#1088;&#1086;&#1087;&#1077;&#1083;&#1083;&#1077;&#1088;&#1099;, &#1072; &#1087;&#1072;&#1090;&#1088;&#1086;&#1085;&#1099; &#1087;&#1088;&#1080;&#1083;&#1077;&#1090;&#1072;&#1102;&#1090; &#1085;&#1072; &#1074;&#1086;&#1079;&#1076;&#1091;&#1096;&#1085;&#1099;&#1093; &#1096;&#1072;&#1088;&#1072;&#1093;.</rus>\n           <eng>In 2050, the remote planet with very low gravitation had been found. Inhabitants of the planet have been enslaved by four huge machine like aliens. The democratic Earth couldn&#8217;t reconcile with such state  and a space shuttle had delivered to this planet a super agent John Petroff who had been dumped on a surface of the planet together with a bicycle and a rocket mount for prompting democracy and bridges of friendship. So, the task of a player is to pass 20 game levels and to destroy all flying objects on levels.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <infon productpage=\"http://www.infon.ru/games.phtml?gid=468360\" cost=\"2.5$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"starharbor\"  title=\"STAR HARBOR\" year=\"2005\">\n        <all/>\n\t\t<shooter/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1078;&#1072;&#1089;&#1085;&#1086;&#1077; &#1074;&#1090;&#1086;&#1088;&#1078;&#1077;&#1085;&#1080;&#1077; &#1075;&#1088;&#1086;&#1079;&#1080;&#1090; &#1047;&#1077;&#1084;&#1083;&#1077;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1086;&#1088;&#1091;&#1076;&#1080;&#1077;&#1084; &#1082;&#1086;&#1089;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1075;&#1086; &#1082;&#1088;&#1077;&#1081;&#1089;&#1077;&#1088;&#1072; &#1080; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1086;&#1090;&#1073;&#1080;&#1090;&#1100; &#1072;&#1090;&#1072;&#1082;&#1091;, &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1080;&#1074; &#1074;&#1089;&#1077; &#1082;&#1088;&#1077;&#1081;&#1089;&#1077;&#1088;&#1099; &#1080; &#1080;&#1089;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083;&#1080;.</rus>\n           <eng>A terrible invasion threatens the Earth.A player is a gunner of a star cruiser gun and your task is to stop the invasion.You have to destroy both cruisers and fighters.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1085;&#1086;&#1081; &#1088;&#1072;&#1079; &#1075;&#1072;&#1076;&#1082;&#1080;&#1077; &#1080;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1103;&#1085;&#1077; &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1102;&#1090;&#1089;&#1103; &#1087;&#1086;&#1087;&#1088;&#1072;&#1090;&#1100; &#1089;&#1074;&#1086;&#1080;&#1084;&#1080; &#1097;&#1091;&#1087;&#1072;&#1083;&#1100;&#1094;&#1072;&#1084;&#1080; &#1085;&#1072;&#1096;&#1091; &#1075;&#1086;&#1083;&#1091;&#1073;&#1091;&#1102; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1091;, &#1085;&#1086; &#1086;&#1085;&#1080; &#1085;&#1077; &#1091;&#1095;&#1083;&#1080; &#1090;&#1086;&#1075;&#1086;, &#1095;&#1090;&#1086; ,&#1085;&#1077;&#1089;&#1084;&#1086;&#1090;&#1088;&#1103; &#1085;&#1072; &#1074;&#1089;&#1077; &#1091;&#1089;&#1080;&#1083;&#1080;&#1103; &#1087;&#1086; &#1091;&#1082;&#1083;&#1086;&#1085;&#1077;&#1085;&#1080;&#1102; &#1086;&#1090; &#1074;&#1086;&#1080;&#1085;&#1089;&#1082;&#1086;&#1081; &#1087;&#1086;&#1074;&#1080;&#1085;&#1085;&#1086;&#1089;&#1090;&#1080;, &#1083;&#1102;&#1073;&#1080;&#1090;&#1077;&#1083;&#1100; &#1082;&#1086;&#1084;&#1087;&#1100;&#1102;&#1090;&#1077;&#1088;&#1085;&#1099;&#1093; &#1080;&#1075;&#1088; &#1048;&#1074;&#1072;&#1085; &#1050;&#1086;&#1087;&#1095;&#1077;&#1085;&#1099;&#1081; &#1073;&#1099;&#1083; &#1079;&#1072;&#1073;&#1088;&#1080;&#1090; &#1074; &#1082;&#1086;&#1089;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080;&#1081; &#1092;&#1083;&#1086;&#1090; &#1080; &#1085;&#1072;&#1093;&#1086;&#1076;&#1080;&#1083;&#1089;&#1103; &#1089;&#1088;&#1077;&#1076;&#1080; &#1085;&#1086;&#1102;&#1097;&#1080;&#1093; &#1086; &#1088;&#1086;&#1076;&#1085;&#1086;&#1084; &#1076;&#1086;&#1084;&#1077; &#1087;&#1088;&#1080;&#1079;&#1099;&#1074;&#1085;&#1080;&#1082;&#1086;&#1074; &#1085;&#1072; &#1073;&#1086;&#1088;&#1090;&#1091; &#1082;&#1086;&#1089;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1075;&#1086; &#1082;&#1088;&#1077;&#1081;&#1089;&#1077;&#1088;&#1072; \"&#1063;&#1077;&#1088;&#1074;&#1086;&#1085;&#1072; &#1059;&#1082;&#1088;&#1072;&#1080;&#1085;&#1072;\", &#1075;&#1086;&#1090;&#1086;&#1074;&#1103;&#1097;&#1077;&#1075;&#1086;&#1089;&#1103; &#1082; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1083;&#1077;&#1085;&#1080;&#1102; &#1085;&#1072; &#1075;&#1088;&#1072;&#1085;&#1080;&#1094;&#1099; &#1089;&#1086;&#1083;&#1085;&#1077;&#1095;&#1085;&#1086;&#1081; &#1089;&#1080;&#1089;&#1090;&#1077;&#1084;&#1099; &#1089; &#1086;&#1088;&#1073;&#1080;&#1090;&#1099; &#1047;&#1077;&#1084;&#1083;&#1080;. &#1053;&#1077;&#1086;&#1078;&#1080;&#1076;&#1072;&#1085;&#1085;&#1086;&#1077; &#1085;&#1072;&#1087;&#1072;&#1076;&#1077;&#1085;&#1080;&#1077; &#1087;&#1088;&#1080;&#1096;&#1077;&#1083;&#1100;&#1094;&#1077;&#1074; &#1090;&#1072;&#1082; &#1087;&#1086;&#1088;&#1072;&#1079;&#1080;&#1083;&#1086; &#1082;&#1086;&#1084;&#1072;&#1085;&#1076;&#1085;&#1099;&#1081; &#1089;&#1086;&#1089;&#1090;&#1072;&#1074; &#1082;&#1088;&#1077;&#1081;&#1089;&#1077;&#1088;&#1072;, &#1095;&#1090;&#1086; &#1086;&#1085;&#1086; &#1085;&#1077;&#1084;&#1077;&#1076;&#1083;&#1077;&#1085;&#1085;&#1086; &#1091;&#1096;&#1083;&#1086; &#1074; &#1079;&#1072;&#1087;&#1086;&#1081; &#1083;&#1077;&#1095;&#1080;&#1090;&#1100; &#1085;&#1077;&#1088;&#1074;&#1099; &#1080; &#1048;&#1074;&#1072;&#1085; &#1086;&#1089;&#1090;&#1072;&#1083;&#1089;&#1103; &#1077;&#1076;&#1080;&#1085;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1099;&#1084; &#1076;&#1077;&#1077;&#1089;&#1087;&#1086;&#1089;&#1086;&#1073;&#1085;&#1099;&#1084; &#1095;&#1083;&#1077;&#1085;&#1086;&#1084; &#1101;&#1082;&#1080;&#1087;&#1072;&#1078;&#1072;. &#1048;&#1090;&#1072;&#1082;, &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1086;&#1090;&#1088;&#1072;&#1079;&#1080;&#1090;&#1100; &#1085;&#1072;&#1087;&#1072;&#1076;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1091;&#1090;&#1077;&#1084; &#1090;&#1086;&#1090;&#1072;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;&#1080;&#1103; &#1072;&#1090;&#1072;&#1082;&#1091;&#1102;&#1097;&#1080;&#1093; &#1089;&#1080;&#1083;. &#1048;&#1075;&#1088;&#1072; &#1086;&#1090; &#1087;&#1077;&#1088;&#1074;&#1086;&#1075;&#1086; &#1083;&#1080;&#1094;&#1072; &#1080;&#1079; &#1088;&#1072;&#1079;&#1088;&#1103;&#1076;&#1072; \"&#1059;&#1073;&#1077;&#1081; &#1080;&#1093; &#1074;&#1089;&#1077;&#1093;\", &#1080;&#1084;&#1077;&#1077;&#1090; &#1090;&#1088;&#1080; &#1091;&#1088;&#1086;&#1074;&#1085;&#1103; &#1089;&#1083;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1080;, &#1088;&#1072;&#1079;&#1083;&#1080;&#1095;&#1072;&#1102;&#1097;&#1080;&#1077;&#1089;&#1103; &#1072;&#1082;&#1090;&#1080;&#1074;&#1085;&#1086;&#1089;&#1090;&#1100;&#1102; &#1080; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1086;&#1084; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;. </rus>\n           <eng>A terrible invasion threatens the Earth.A player is a gunner of a star cruiser gun and your task is to stop the invasion.You have to destroy both cruisers and fighters.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <infon productpage=\"http://www.infon.ru/games.phtml?gid=468366\" cost=\"2.5$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30bw\"/>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series45a\"/>\n            <siemens family=\"series45b\"/>\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"kalah\"  title=\"KALAH\" year=\"2004\">\n        <all/>\n\t\t<logic/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1086;&#1081; &#1085;&#1072;&#1089;&#1090;&#1086;&#1083;&#1100;&#1085;&#1086;&#1081; &#1080;&#1075;&#1088;&#1099; &#1050;&#1040;&#1051;&#1040;&#1061;. &#1062;&#1077;&#1083;&#1100; &#1080;&#1075;&#1088;&#1099; - &#1074;&#1079;&#1103;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1072;&#1084;&#1085;&#1077;&#1081;.</rus>\n           <eng>A mobile version of the well known KALAH game. The object of the game is to move as many stones as possible into your KALAH (right bowl).</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1086;&#1081; &#1083;&#1086;&#1075;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1081; &#1080;&#1075;&#1088;&#1099; Kalah. &#1047;&#1072;&#1076;&#1072;&#1095;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1089;&#1086;&#1073;&#1088;&#1072;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1072;&#1084;&#1085;&#1077;&#1081; &#1074; &#1089;&#1074;&#1086;&#1081; &#1082;&#1072;&#1083;&#1072;&#1093; (&#1087;&#1088;&#1072;&#1074;&#1072;&#1103; &#1083;&#1086;&#1078;&#1073;&#1080;&#1085;&#1082;&#1072; &#1085;&#1072; &#1080;&#1075;&#1088;&#1086;&#1074;&#1086;&#1084; &#1087;&#1086;&#1083;&#1077;). &#1055;&#1088;&#1080; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1085;&#1086;&#1084; &#1093;&#1086;&#1076;&#1077; &#1080;&#1075;&#1088;&#1072;&#1102;&#1097;&#1080;&#1081; &#1089;&#1085;&#1080;&#1084;&#1072;&#1077;&#1090; &#1089; &#1086;&#1076;&#1085;&#1086;&#1075;&#1086; &#1080;&#1079; &#1089;&#1074;&#1086;&#1080;&#1093; &#1087;&#1086;&#1083;&#1077;&#1081; &#1074;&#1089;&#1077; &#1082;&#1072;&#1084;&#1085;&#1080; &#1080; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1090; &#1080;&#1093; &#1087;&#1086; &#1086;&#1076;&#1085;&#1086;&#1084;&#1091; &#1085;&#1072; &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1077; &#1087;&#1086;&#1083;&#1103; &#1074; &#1087;&#1086;&#1088;&#1103;&#1076;&#1082;&#1077; &#1074;&#1086;&#1079;&#1088;&#1072;&#1089;&#1090;&#1072;&#1085;&#1080;&#1103; &#1080;&#1093; &#1085;&#1086;&#1084;&#1077;&#1088;&#1086;&#1074;; &#1087;&#1086;&#1083;&#1077;&#1084;, &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1084; &#1079;&#1072; &#1096;&#1077;&#1089;&#1090;&#1099;&#1084;, &#1089;&#1095;&#1080;&#1090;&#1072;&#1077;&#1090;&#1089;&#1103; &#1089;&#1074;&#1086;&#1081; &#1082;&#1072;&#1083;&#1072;&#1093;. &#1044;&#1072;&#1083;&#1077;&#1077; &#1082;&#1072;&#1084;&#1085;&#1080; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1087;&#1086; &#1095;&#1091;&#1078;&#1080;&#1084; &#1087;&#1086;&#1083;&#1103;&#1084; (&#1086;&#1087;&#1103;&#1090;&#1100;-&#1090;&#1072;&#1082;&#1080; &#1074; &#1087;&#1086;&#1088;&#1103;&#1076;&#1082;&#1077; &#1074;&#1086;&#1079;&#1088;&#1072;&#1089;&#1090;&#1072;&#1085;&#1080;&#1103; &#1080;&#1093; &#1085;&#1086;&#1084;&#1077;&#1088;&#1086;&#1074;), &#1079;&#1072;&#1090;&#1077;&#1084; &#1074;&#1085;&#1086;&#1074;&#1100; &#1087;&#1086; &#1089;&#1074;&#1086;&#1080;&#1084; (&#1095;&#1091;&#1078;&#1086;&#1081; &#1082;&#1072;&#1083;&#1072;&#1093; &#1087;&#1088;&#1086;&#1087;&#1091;&#1089;&#1082;&#1072;&#1077;&#1090;&#1089;&#1103;) &#1080; &#1090;&#1072;&#1082; &#1076;&#1072;&#1083;&#1077;&#1077;, &#1082;&#1072;&#1082; &#1073;&#1099; &#1089;&#1086;&#1074;&#1077;&#1088;&#1096;&#1072;&#1103; &#1086;&#1073;&#1093;&#1086;&#1076; &#1087;&#1086;&#1083;&#1077;&#1081; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074; &#1095;&#1072;&#1089;&#1086;&#1074;&#1086;&#1081; &#1089;&#1090;&#1088;&#1077;&#1083;&#1082;&#1080;. &#1045;&#1089;&#1083;&#1080; &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1085;&#1080;&#1081; &#1080;&#1079; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084;&#1099;&#1093; &#1082;&#1072;&#1084;&#1085;&#1077;&#1081; &#1087;&#1086;&#1087;&#1072;&#1083; &#1074; &#171;&#1089;&#1074;&#1086;&#1081;&#187; &#1082;&#1072;&#1083;&#1072;&#1093;, &#1090;&#1086; &#1080;&#1075;&#1088;&#1086;&#1082; &#1076;&#1077;&#1083;&#1072;&#1077;&#1090; &#1077;&#1097;&#1077; &#1086;&#1076;&#1080;&#1085; &#1093;&#1086;&#1076;. &#1042;&#1086; &#1074;&#1089;&#1077;&#1093; &#1086;&#1089;&#1090;&#1072;&#1083;&#1100;&#1085;&#1099;&#1093; &#1089;&#1083;&#1091;&#1095;&#1072;&#1103;&#1093; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1100; &#1093;&#1086;&#1076;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1077;&#1090;&#1089;&#1103; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1091;. &#1045;&#1089;&#1083;&#1080; &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1085;&#1080;&#1081; &#1082;&#1072;&#1084;&#1077;&#1085;&#1100; &#1087;&#1086;&#1087;&#1072;&#1083; &#1085;&#1072; &#1087;&#1091;&#1089;&#1090;&#1086;&#1077; &#1087;&#1086;&#1083;&#1077; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072;, &#1089;&#1086;&#1074;&#1077;&#1088;&#1096;&#1072;&#1074;&#1096;&#1077;&#1075;&#1086; &#1093;&#1086;&#1076;, &#1072; &#1085;&#1072; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1086;&#1087;&#1086;&#1083;&#1086;&#1078;&#1085;&#1086;&#1084; &#1087;&#1086;&#1083;&#1077; &#1089;&#1086;&#1087;&#1077;&#1088;&#1085;&#1080;&#1082;&#1072; &#1077;&#1089;&#1090;&#1100; &#1093;&#1086;&#1090;&#1103; &#1073;&#1099; &#1086;&#1076;&#1080;&#1085; &#1082;&#1072;&#1084;&#1077;&#1085;&#1100;, &#1090;&#1086; &#1089;&#1086;&#1076;&#1077;&#1088;&#1078;&#1080;&#1084;&#1086;&#1077; &#1086;&#1073;&#1086;&#1080;&#1093; &#1087;&#1086;&#1083;&#1077;&#1081; &#1087;&#1077;&#1088;&#1077;&#1085;&#1086;&#1089;&#1080;&#1090;&#1089;&#1103; &#1074; &#1050;&#1040;&#1051;&#1040;&#1061; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072;, &#1089;&#1086;&#1074;&#1077;&#1088;&#1096;&#1072;&#1074;&#1096;&#1077;&#1075;&#1086; &#1093;&#1086;&#1076; (&#1087;&#1086;&#1089;&#1083;&#1077; &#1095;&#1077;&#1075;&#1086;, &#1093;&#1086;&#1076; &#1087;&#1077;&#1088;&#1077;&#1093;&#1086;&#1076;&#1080;&#1090; &#1082; &#1077;&#1075;&#1086; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1091;). &#1045;&#1089;&#1083;&#1080; &#1085;&#1072; &#1087;&#1086;&#1083;&#1103;&#1093; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072;, &#1089;&#1076;&#1077;&#1083;&#1072;&#1074;&#1096;&#1077;&#1075;&#1086; &#1093;&#1086;&#1076;, &#1085;&#1077; &#1086;&#1089;&#1090;&#1072;&#1077;&#1090;&#1089;&#1103; &#1085;&#1080; &#1086;&#1076;&#1085;&#1086;&#1075;&#1086; &#1082;&#1072;&#1084;&#1085;&#1103;, &#1090;&#1086; &#1074;&#1089;&#1077; &#1082;&#1072;&#1084;&#1085;&#1080;, &#1085;&#1072;&#1093;&#1086;&#1076;&#1103;&#1097;&#1080;&#1077;&#1089;&#1103; &#1085;&#1072; &#1087;&#1086;&#1083;&#1103;&#1093; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;, &#1087;&#1077;&#1088;&#1077;&#1085;&#1086;&#1089;&#1103;&#1090;&#1089;&#1103; &#1074; &#1082;&#1072;&#1083;&#1072;&#1093; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;, &#1080; &#1080;&#1075;&#1088;&#1072; &#1079;&#1072;&#1082;&#1072;&#1085;&#1095;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103;. &#1048;&#1075;&#1088;&#1072; &#1079;&#1072;&#1082;&#1072;&#1085;&#1095;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103;, &#1082;&#1086;&#1075;&#1076;&#1072; &#1086;&#1076;&#1085;&#1086;&#1084;&#1091; &#1080;&#1079; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1086;&#1074; &#1085;&#1077;&#1095;&#1077;&#1084; &#1093;&#1086;&#1076;&#1080;&#1090;&#1100;. &#1042;&#1099;&#1080;&#1075;&#1088;&#1099;&#1074;&#1072;&#1077;&#1090; &#1090;&#1086;&#1090;, &#1091; &#1082;&#1086;&#1075;&#1086; &#1087;&#1086; &#1086;&#1082;&#1086;&#1085;&#1095;&#1072;&#1085;&#1080;&#1080; &#1080;&#1075;&#1088;&#1099; &#1074; &#1082;&#1072;&#1083;&#1072;&#1093;&#1077; &#1086;&#1082;&#1072;&#1079;&#1072;&#1083;&#1086;&#1089;&#1100; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1072;&#1084;&#1085;&#1077;&#1081;. &#1045;&#1089;&#1083;&#1080; &#1074; &#1086;&#1073;&#1086;&#1080;&#1093; &#1082;&#1072;&#1083;&#1072;&#1093;&#1072;&#1093; &#1085;&#1072;&#1093;&#1086;&#1076;&#1080;&#1090;&#1089;&#1103; &#1087;&#1086; 36 &#1082;&#1072;&#1084;&#1085;&#1077;&#1081;, &#1092;&#1080;&#1082;&#1089;&#1080;&#1088;&#1091;&#1077;&#1090;&#1089;&#1103; &#1085;&#1080;&#1095;&#1100;&#1103;.</rus>\n           <eng>A mobile version of the well known KALAH game. The object of the game is to move as many stones as possible into your KALAH (right bowl).</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <playmobile productpage=\"http://www.playmobile.ru/games/logic/Kalah\" cost=\"3$\"/>\n  \t\t   <nikita productpage=\"http://www.888x.ru/javagames/show.php?ng=2059&amp;actnum=1&amp;md=76\" cost=\"3$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"papaninsquest\"  title=\"PAPANIN'S QUEST\" year=\"2004\">\n        <all/>\n\t\t<quest/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1080;&#1075;&#1088;&#1072;&#1077;&#1090; &#1079;&#1072; &#1087;&#1091;&#1090;&#1077;&#1096;&#1077;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1080;&#1082;&#1072; &#1055;&#1072;&#1087;&#1072;&#1085;&#1080;&#1085;&#1072;, &#1087;&#1088;&#1086;&#1074;&#1072;&#1083;&#1080;&#1074;&#1096;&#1077;&#1075;&#1086;&#1089;&#1103; &#1074; &#1091;&#1078;&#1072;&#1089;&#1085;&#1091;&#1102; &#1087;&#1080;&#1088;&#1072;&#1084;&#1080;&#1076;&#1091; &#1085;&#1072; &#1070;&#1078;&#1085;&#1086;&#1084; &#1087;&#1086;&#1083;&#1102;&#1089;&#1077; &#1080; &#1080;&#1097;&#1091;&#1097;&#1077;&#1075;&#1086; &#1087;&#1091;&#1090;&#1100; &#1076;&#1086;&#1084;&#1086;&#1081;.</rus>\n           <eng>You have to help Papanin to find the way out of the terrible maze. The object of the game is to collect all magic stones in the maze.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1055;&#1091;&#1090;&#1077;&#1096;&#1077;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1080;&#1082; &#1055;&#1072;&#1087;&#1072;&#1085;&#1080;&#1085; &#1086;&#1073;&#1085;&#1072;&#1088;&#1091;&#1078;&#1080;&#1083; &#1077;&#1075;&#1080;&#1087;&#1077;&#1090;&#1089;&#1082;&#1091;&#1102; &#1087;&#1080;&#1088;&#1072;&#1084;&#1080;&#1076;&#1091;, &#1079;&#1072;&#1090;&#1077;&#1088;&#1103;&#1085;&#1085;&#1091;&#1102; &#1074;&#1086; &#1083;&#1100;&#1076;&#1072;&#1093; &#1040;&#1085;&#1090;&#1072;&#1088;&#1082;&#1090;&#1080;&#1082;&#1080;. &#1055;&#1088;&#1080; &#1086;&#1089;&#1084;&#1086;&#1090;&#1088;&#1077; &#1086;&#1085; &#1087;&#1088;&#1086;&#1074;&#1072;&#1083;&#1080;&#1083;&#1089;&#1103; &#1074; &#1088;&#1072;&#1089;&#1097;&#1077;&#1083;&#1080;&#1085;&#1091; &#1080; &#1086;&#1082;&#1072;&#1079;&#1072;&#1083;&#1089;&#1103; &#1074;&#1085;&#1091;&#1090;&#1088;&#1080;. &#1047;&#1072;&#1076;&#1072;&#1095;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#8212; &#1087;&#1086;&#1084;&#1086;&#1095;&#1100; &#1055;&#1072;&#1087;&#1072;&#1085;&#1080;&#1085;&#1091; &#1074;&#1099;&#1073;&#1088;&#1072;&#1090;&#1100;&#1089;&#1103; &#1085;&#1072;&#1088;&#1091;&#1078;&#1091;, &#1087;&#1088;&#1077;&#1086;&#1076;&#1086;&#1083;&#1077;&#1074; 10 &#1080;&#1075;&#1088;&#1086;&#1074;&#1099;&#1093; &#1091;&#1088;&#1086;&#1074;&#1085;&#1077;&#1081;. &#1063;&#1090;&#1086;&#1073;&#1099; &#1087;&#1088;&#1086;&#1081;&#1090;&#1080; &#1080;&#1075;&#1088;&#1086;&#1074;&#1086;&#1081; &#1091;&#1088;&#1086;&#1074;&#1077;&#1085;&#1100;, &#1090;&#1088;&#1077;&#1073;&#1091;&#1077;&#1090;&#1089;&#1103; &#1089;&#1086;&#1073;&#1088;&#1072;&#1090;&#1100; &#1074;&#1089;&#1077; &#1073;&#1088;&#1080;&#1083;&#1083;&#1080;&#1072;&#1085;&#1090;&#1099;, &#1088;&#1072;&#1089;&#1087;&#1086;&#1083;&#1086;&#1078;&#1077;&#1085;&#1085;&#1099;&#1077; &#1074; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1077;, &#1087;&#1086;&#1089;&#1083;&#1077; &#1095;&#1077;&#1075;&#1086; &#1087;&#1086;&#1103;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1082;&#1083;&#1102;&#1095;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1084; &#1084;&#1086;&#1078;&#1085;&#1086; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1100; &#1076;&#1074;&#1077;&#1088;&#1100; &#1085;&#1072; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1081; &#1091;&#1088;&#1086;&#1074;&#1077;&#1085;&#1100;. &#1042; &#1087;&#1088;&#1086;&#1093;&#1086;&#1078;&#1076;&#1077;&#1085;&#1080;&#1080; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1086;&#1074;, &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1084;&#1077;&#1096;&#1072;&#1102;&#1090; &#1088;&#1072;&#1079;&#1083;&#1080;&#1095;&#1085;&#1086;&#1075;&#1086; &#1074;&#1080;&#1076;&#1072; &#1084;&#1086;&#1085;&#1089;&#1090;&#1088;&#1099;, &#1089; &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1084;&#1080; &#1080;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1073;&#1086;&#1088;&#1086;&#1090;&#1100;&#1089;&#1103; &#1087;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1084;&#1077;&#1095;&#1077;&#1081;, &#1088;&#1072;&#1079;&#1073;&#1088;&#1086;&#1089;&#1072;&#1085;&#1085;&#1099;&#1093; &#1087;&#1086; &#1091;&#1088;&#1086;&#1074;&#1085;&#1102;. &#1046;&#1080;&#1079;&#1085;&#1080; &#1084;&#1086;&#1078;&#1085;&#1086; &#1074;&#1086;&#1089;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1080;&#1090;&#1100; &#1087;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1082;&#1091;&#1074;&#1096;&#1080;&#1085;&#1072; &#1089; &#1074;&#1086;&#1076;&#1086;&#1081;, &#1072; &#1085;&#1077;&#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1091;&#1095;&#1072;&#1089;&#1090;&#1082;&#1080; &#1087;&#1086;&#1083;&#1072; &#1084;&#1086;&#1078;&#1085;&#1086; &#1087;&#1088;&#1086;&#1073;&#1080;&#1074;&#1072;&#1090;&#1100; &#1087;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1082;&#1080;&#1088;&#1082;&#1080;.</rus>\n           <eng>Ivan Papanin, the well-known Polar researcher, discovered an ancient Egyptian pyramid lost in the Antarctic ice. When examining the pyramid, he fell down and found himself inside of it. You have to help Papanin to find the way out of this terrible maze. The object of the game is to collect all magic stones in the maze to get the key that opens the door to the next level. You can use a pick to make holes in the floor. Swords scattered on the level will help you to fight with monsters. Be careful, after some period of time the destroyed monsters reappear. If you need to restore your life power, drink some water  from a jar. But all these items can be used only once.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <playmobile productpage=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" cost=\"2$\"/>\n  \t\t   <nikita productpage=\"http://www.888x.ru/javagames/show.php?ng=2061&amp;actnum=1&amp;md=76\" cost=\"3\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"mobilechase\"  title=\"MOBILE CHASE\" year=\"2004\">\n        <all/>\n\t\t<racing/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1042;&#1099; &#1084;&#1080;&#1088;&#1085;&#1086; &#1086;&#1090;&#1076;&#1099;&#1093;&#1072;&#1083;&#1080; &#1085;&#1072; &#1086;&#1073;&#1086;&#1095;&#1080;&#1085;&#1077;, &#1089;&#1080;&#1076;&#1103; &#1074; &#1089;&#1074;&#1086;&#1077;&#1081; &#1087;&#1086;&#1083;&#1080;&#1094;&#1077;&#1081;&#1089;&#1082;&#1086;&#1081; &#1084;&#1072;&#1096;&#1080;&#1085;&#1077;, &#1082;&#1086;&#1075;&#1076;&#1072; &#1087;&#1086;&#1089;&#1090;&#1091;&#1087;&#1080;&#1083;&#1086; &#1089;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077; &#1086;&#1073; &#1086;&#1075;&#1088;&#1072;&#1073;&#1083;&#1077;&#1085;&#1080;&#1080; &#1073;&#1072;&#1085;&#1082;&#1072;. &#1042; &#1087;&#1086;&#1075;&#1086;&#1085;&#1102;!</rus>\n           <eng>You are a brave policeman who has received the message about a bank robbery. Your have to overtake the gangsters and stop their van.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1072;&#1075;&#1085;&#1072;&#1090;&#1100; &#1092;&#1091;&#1088;&#1075;&#1086;&#1085; &#1087;&#1088;&#1077;&#1089;&#1090;&#1091;&#1087;&#1085;&#1080;&#1082;&#1086;&#1074; &#1080; &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1103; &#1074; &#1085;&#1077;&#1075;&#1086;, &#1079;&#1072;&#1089;&#1090;&#1072;&#1074;&#1080;&#1090;&#1100; &#1077;&#1075;&#1086; &#1086;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1080;&#1090;&#1100;&#1089;&#1103;. &#1055;&#1088;&#1080; &#1101;&#1090;&#1086;&#1084; &#1085;&#1072;&#1076;&#1086; &#1086;&#1073;&#1098;&#1077;&#1079;&#1078;&#1072;&#1090;&#1100; &#1087;&#1088;&#1077;&#1087;&#1103;&#1090;&#1089;&#1090;&#1074;&#1080;&#1103; &#1085;&#1072; &#1076;&#1086;&#1088;&#1086;&#1075;&#1077; &#1080; &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1090;&#1100; &#1089;&#1090;&#1086;&#1083;&#1082;&#1085;&#1086;&#1074;&#1077;&#1085;&#1080;&#1103; &#1089; &#1076;&#1088;&#1091;&#1075;&#1080;&#1084;&#1080; &#1091;&#1095;&#1072;&#1089;&#1090;&#1085;&#1080;&#1082;&#1072;&#1084;&#1080; &#1076;&#1086;&#1088;&#1086;&#1078;&#1085;&#1086;&#1075;&#1086; &#1076;&#1074;&#1080;&#1078;&#1077;&#1085;&#1080;&#1103;. &#1058;&#1072;&#1082; &#1078;&#1077; &#1089;&#1083;&#1077;&#1076;&#1091;&#1077;&#1090; &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1090;&#1100; &#1083;&#1091;&#1078;, &#1090;&#1072;&#1082; &#1082;&#1072;&#1082; &#1086;&#1085;&#1080; &#1076;&#1077;&#1083;&#1072;&#1102;&#1090; &#1072;&#1074;&#1090;&#1086;&#1084;&#1086;&#1073;&#1080;&#1083;&#1100; &#1085;&#1077;&#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1084;&#1099;&#1084;. </rus>\n           <eng>You are a brave policeman who has received the message about a bank robbery. Your have to overtake the gangsters and stop their van.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <playmobile productpage=\"http://www.playmobile.ru/games/race/Mobile_Chase\" cost=\"3$\"/>\n  \t\t   <nikita productpage=\"http://www.888x.ru/javagames/show.php?ng=2060&amp;actnum=1&amp;md=76\" cost=\"3$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"caspianmonster\"  title=\"CASPIAN MONSTER\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1089;&#1077;&#1082;&#1088;&#1077;&#1090;&#1085;&#1099;&#1084; &#1089;&#1086;&#1074;&#1077;&#1090;&#1089;&#1082;&#1080;&#1084; &#1101;&#1082;&#1088;&#1072;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1086;&#1084;, &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1100; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072; &#1080; &#1085;&#1072;&#1081;&#1076;&#1080; &#1074;&#1099;&#1093;&#1086;&#1076; &#1089; &#1073;&#1072;&#1079;&#1099;.</rus>\n           <eng>You are a pilot of a secret soviet airfoil boat, which is armed with missiles and a quick-firer.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1058;&#1077;&#1088;&#1088;&#1086;&#1088;&#1080;&#1089;&#1090;&#1099; &#1087;&#1086;&#1093;&#1080;&#1090;&#1080;&#1083;&#1080; &#1089;&#1077;&#1082;&#1088;&#1077;&#1090;&#1085;&#1099;&#1081; &#1101;&#1082;&#1088;&#1072;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085; &#171;&#1050;&#1072;&#1089;&#1087;&#1080;&#1081;&#1089;&#1082;&#1080;&#1081; &#1084;&#1086;&#1085;&#1089;&#1090;&#1088;&#187;, &#1074;&#1086;&#1086;&#1088;&#1091;&#1078;&#1077;&#1085;&#1085;&#1099;&#1081; &#1089;&#1072;&#1084;&#1099;&#1084; &#1089;&#1086;&#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1085;&#1099;&#1084; &#1086;&#1088;&#1091;&#1078;&#1080;&#1077;&#1084;, &#1085;&#1086; &#1074;&#1072;&#1084; &#1091;&#1076;&#1072;&#1083;&#1086;&#1089;&#1100; &#1087;&#1088;&#1086;&#1085;&#1080;&#1082;&#1085;&#1091;&#1090;&#1100; &#1085;&#1072; &#1080;&#1093; &#1073;&#1072;&#1079;&#1091; &#1080; &#1091;&#1075;&#1085;&#1072;&#1090;&#1100; &#1101;&#1082;&#1088;&#1072;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;. &#1042;&#1072;&#1096;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1087;&#1088;&#1086;&#1081;&#1090;&#1080; &#1090;&#1088;&#1080; &#1091;&#1095;&#1072;&#1089;&#1090;&#1082;&#1072; &#1086;&#1090; &#1073;&#1072;&#1079;&#1099; &#1082; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1086;&#1084;&#1091; &#1084;&#1086;&#1088;&#1102;, &#1085;&#1072;&#1096;&#1087;&#1080;&#1075;&#1086;&#1074;&#1072;&#1085;&#1085;&#1099;&#1093; &#1074;&#1088;&#1072;&#1078;&#1077;&#1089;&#1082;&#1086;&#1081; &#1090;&#1077;&#1093;&#1085;&#1080;&#1082;&#1086;&#1081; &#1080; &#1084;&#1080;&#1085;&#1072;&#1084;&#1080;.&#1042;&#1086;&#1086;&#1088;&#1091;&#1078;&#1077;&#1085;&#1080;&#1077; &#1089;&#1086;&#1089;&#1090;&#1086;&#1080;&#1090; &#1080;&#1079; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1081; &#1087;&#1091;&#1096;&#1082;&#1080; &#1080; &#1076;&#1074;&#1091;&#1093; &#1074;&#1080;&#1076;&#1086;&#1074; &#1088;&#1072;&#1082;&#1077;&#1090;, &#1089;&#1072;&#1084;&#1086;&#1085;&#1072;&#1074;&#1086;&#1076;&#1103;&#1097;&#1080;&#1093;&#1089;&#1103; &#1080; &#1085;&#1077;&#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1084;&#1099;&#1093;. &#1057;&#1072;&#1084;&#1086;&#1085;&#1072;&#1074;&#1086;&#1076;&#1103;&#1097;&#1080;&#1077;&#1089;&#1103; &#1088;&#1072;&#1082;&#1077;&#1090;&#1099; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1074;&#1099;&#1073;&#1080;&#1088;&#1072;&#1102;&#1090; &#1094;&#1077;&#1083;&#1100; &#1080; &#1088;&#1072;&#1089;&#1089;&#1095;&#1080;&#1090;&#1099;&#1074;&#1072;&#1102;&#1090; &#1089;&#1074;&#1086;&#1102; &#1090;&#1088;&#1072;&#1077;&#1082;&#1090;&#1086;&#1088;&#1080;&#1102;, &#1072; &#1085;&#1077;&#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1084;&#1099;&#1077; &#1083;&#1077;&#1090;&#1103;&#1090; &#1087;&#1086; &#1082;&#1091;&#1088;&#1089;&#1091; &#1101;&#1082;&#1088;&#1072;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1072; &#1080; &#1086;&#1095;&#1077;&#1085;&#1100; &#1087;&#1086;&#1083;&#1077;&#1079;&#1085;&#1099; &#1076;&#1083;&#1103; &#1088;&#1072;&#1079;&#1088;&#1091;&#1096;&#1077;&#1085;&#1080;&#1103; &#1084;&#1086;&#1089;&#1090;&#1086;&#1074;.</rus>\n           <eng>You are a pilot of a secret soviet airfoil boat, which is armed with missiles and a quick-firer. Your main objective is to leave the enemy base destroying as much military equipment as possible.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <playmobile productpage=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" cost=\"2$\"/>\n  \t\t   <nikita productpage=\"http://www.888x.ru/javagames/show.php?ng=2058&amp;actnum=1&amp;md=76\" cost=\"3$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"airaggression\"  title=\"AIR AGGRESSION\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1085;&#1099;&#1077; &#1084;&#1086;&#1085;&#1089;&#1090;&#1088;&#1099; &#1074;&#1079;&#1103;&#1083;&#1080; &#1082;&#1086;&#1085;&#1090;&#1088;&#1086;&#1083;&#1100; &#1085;&#1072;&#1076; &#1079;&#1077;&#1084;&#1085;&#1099;&#1084;&#1080; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090;&#1072;&#1084;&#1080;, &#1089;&#1087;&#1072;&#1089;&#1080; &#1084;&#1080;&#1088;!</rus>\n           <eng>Eight alien monsters took control over all Earth's war-planes to enslave our planet.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1059; &#1079;&#1077;&#1084;&#1083;&#1103;&#1085; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1085;&#1072;&#1103; &#1085;&#1072;&#1087;&#1072;&#1089;&#1090;&#1100; &#8212; 8 &#1080;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1085;&#1099;&#1093; &#1084;&#1086;&#1085;&#1089;&#1090;&#1088;&#1086;&#1074; &#1079;&#1072;&#1093;&#1074;&#1072;&#1090;&#1080;&#1083;&#1080; &#1074;&#1083;&#1072;&#1089;&#1090;&#1100; &#1085;&#1072;&#1076; &#1074;&#1089;&#1077;&#1084;&#1080; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090;&#1072;&#1084;&#1080; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1099; &#1080; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1074;&#1072;&#1096; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090; &#1095;&#1091;&#1076;&#1086;&#1084; &#1080;&#1079;&#1073;&#1077;&#1078;&#1072;&#1083; &#1080;&#1093; &#1074;&#1083;&#1080;&#1103;&#1085;&#1080;&#1103;. &#1042;&#1072;&#1096;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1080;&#1090;&#1100; &#1074;&#1089;&#1077;&#1093; &#1074;&#1086;&#1089;&#1100;&#1084;&#1077;&#1088;&#1099;&#1093; &#1084;&#1086;&#1085;&#1089;&#1090;&#1088;&#1086;&#1074;, &#1087;&#1088;&#1080;&#1085;&#1103;&#1074;&#1096;&#1080;&#1093; &#1086;&#1073;&#1088;&#1072;&#1079;&#1099; &#1075;&#1080;&#1075;&#1072;&#1085;&#1090;&#1089;&#1082;&#1080;&#1093; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090;&#1086;&#1074;, &#1080; &#1074;&#1077;&#1088;&#1085;&#1091;&#1090;&#1100; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1077; &#1084;&#1080;&#1088; &#1080; &#1089;&#1087;&#1086;&#1082;&#1086;&#1081;&#1089;&#1090;&#1074;&#1080;&#1077;. &#1059;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1084;&#1072;&#1083;&#1077;&#1085;&#1100;&#1082;&#1080;&#1084; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090;&#1080;&#1082;&#1086;&#1084; &#1085;&#1072; &#1101;&#1082;&#1088;&#1072;&#1085;&#1077;, &#1089;&#1083;&#1077;&#1076;&#1091;&#1077;&#1090; &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1090;&#1100; &#1089;&#1090;&#1086;&#1083;&#1082;&#1085;&#1086;&#1074;&#1077;&#1085;&#1080;&#1103; &#1089; &#1076;&#1088;&#1091;&#1075;&#1080;&#1084;&#1080; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090;&#1072;&#1084;&#1080;, &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1090;&#1100; &#1087;&#1086;&#1087;&#1072;&#1076;&#1072;&#1085;&#1080;&#1081; &#1080; &#1073;&#1088;&#1072;&#1090;&#1100; &#1073;&#1086;&#1085;&#1091;&#1089;&#1099; &#1080; &#1086;&#1088;&#1091;&#1078;&#1080;&#1077;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1086;&#1077; &#1076;&#1086;&#1089;&#1090;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1086;&#1084; &#1087;&#1086;&#1076;&#1076;&#1077;&#1088;&#1078;&#1082;&#1080;. </rus>\n           <eng>Eight alien monsters took control over all Earth's war-planes to enslave our planet. You were able to keep one plane from being captured and now you have got a chance to keep mankind free.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <playmobile productpage=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" cost=\"3$\"/>\n  \t\t   <nikita productpage=\"http://www.888x.ru/javagames/show.php?ng=2057&amp;actnum=1&amp;md=76\" cost=\"3$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n        </devices>\n\t</game>\n\n    <game id=\"blazinggears\"  title=\"BLAZING GEARS\" year=\"2004\">\n        <all/>\n\t\t<racing/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1075;&#1086;&#1085;&#1086;&#1095;&#1085;&#1086;&#1081; &#1084;&#1072;&#1096;&#1080;&#1085;&#1086;&#1081;, &#1085;&#1072;&#1076;&#1086; &#1087;&#1086;&#1082;&#1072;&#1079;&#1072;&#1090;&#1100; &#1083;&#1091;&#1095;&#1096;&#1077;&#1077; &#1074;&#1088;&#1077;&#1084;&#1103;.</rus>\n           <eng>You are a driver of a sport car and your task is to pass loops for a limited time. You have to avoid collisions with other cars on the road.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1074;&#1086;&#1076;&#1080;&#1090;&#1077;&#1083;&#1100; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1096;&#1080;&#1085;&#1099;, &#1091;&#1095;&#1072;&#1089;&#1090;&#1074;&#1091;&#1102;&#1097;&#1077;&#1081; &#1074; &#1075;&#1086;&#1085;&#1082;&#1072;&#1093; &#1073;&#1077;&#1079; &#1087;&#1088;&#1072;&#1074;&#1080;&#1083;. &#1053;&#1072; &#1087;&#1088;&#1086;&#1093;&#1086;&#1078;&#1076;&#1077;&#1085;&#1080;&#1077; &#1082;&#1072;&#1078;&#1076;&#1086;&#1075;&#1086; &#1101;&#1090;&#1072;&#1087;&#1072; &#1075;&#1086;&#1085;&#1086;&#1082; &#1074;&#1072;&#1084; &#1076;&#1072;&#1077;&#1090;&#1089;&#1103; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1085;&#1086;&#1077; &#1074;&#1088;&#1077;&#1084;&#1103;. &#1044;&#1074;&#1080;&#1075;&#1072;&#1081;&#1090;&#1077;&#1089;&#1100; &#1085;&#1072; &#1084;&#1072;&#1082;&#1089;&#1080;&#1084;&#1072;&#1083;&#1100;&#1085;&#1086;&#1081; &#1089;&#1082;&#1086;&#1088;&#1086;&#1089;&#1090;&#1080;, &#1085;&#1086; &#1087;&#1086;&#1089;&#1090;&#1072;&#1088;&#1072;&#1081;&#1090;&#1077;&#1089;&#1100; &#1085;&#1077; &#1089;&#1090;&#1072;&#1083;&#1082;&#1080;&#1074;&#1072;&#1090;&#1100;&#1089;&#1103; &#1089; &#1076;&#1088;&#1091;&#1075;&#1080;&#1084;&#1080; &#1084;&#1072;&#1096;&#1080;&#1085;&#1072;&#1084;&#1080;!</rus>\n           <eng>You are a driver of a sport car and your task is to pass loops for a limited time. You have to avoid collisions with other cars on the road.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"castleassault\"  title=\"CASTLE ASSAULT\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1053;&#1072;&#1076;&#1086; &#1088;&#1072;&#1079;&#1073;&#1080;&#1090;&#1100; &#1082;&#1088;&#1077;&#1087;&#1086;&#1089;&#1090;&#1085;&#1091;&#1102; &#1089;&#1090;&#1077;&#1085;&#1091;, &#1095;&#1090;&#1086; &#1073;&#1099; &#1079;&#1072;&#1093;&#1074;&#1072;&#1090;&#1080;&#1090;&#1100; &#1079;&#1072;&#1084;&#1086;&#1082;.</rus>\n           <eng>To break a castle wall by a catapult.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090;&#1077; &#1082;&#1072;&#1090;&#1072;&#1087;&#1091;&#1083;&#1100;&#1090;&#1086;&#1081; &#1080; &#1076;&#1086;&#1083;&#1078;&#1085;&#1099; &#1088;&#1072;&#1079;&#1088;&#1091;&#1096;&#1080;&#1090;&#1100; &#1076;&#1074;&#1072; &#1089;&#1086;&#1089;&#1077;&#1076;&#1085;&#1080;&#1093; &#1091;&#1095;&#1072;&#1089;&#1090;&#1082;&#1072; &#1089;&#1090;&#1077;&#1085;&#1099; &#1086;&#1089;&#1072;&#1078;&#1076;&#1077;&#1085;&#1085;&#1086;&#1075;&#1086; &#1079;&#1072;&#1084;&#1082;&#1072;. &#1044;&#1086;&#1078;&#1076;&#1080;&#1090;&#1077;&#1089;&#1100; &#1079;&#1072;&#1088;&#1103;&#1076;&#1082;&#1080; &#1082;&#1072;&#1090;&#1072;&#1087;&#1091;&#1083;&#1100;&#1090;&#1099; &#1080; &#1089;&#1083;&#1077;&#1076;&#1080;&#1090;&#1077; &#1079;&#1072; &#1091;&#1082;&#1072;&#1079;&#1072;&#1090;&#1077;&#1083;&#1077;&#1084; &#1074;&#1099;&#1089;&#1086;&#1090;&#1099; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;&#1080;&#1074;&#1072;&#1085;&#1080;&#1103;. &#1057;&#1090;&#1077;&#1085;&#1091; &#1084;&#1086;&#1078;&#1085;&#1086; &#1088;&#1072;&#1079;&#1088;&#1091;&#1096;&#1080;&#1090;&#1100; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1089;&#1074;&#1077;&#1088;&#1093;&#1091; &#1074;&#1085;&#1080;&#1079;. &#1053;&#1086; &#1073;&#1077;&#1088;&#1077;&#1075;&#1080;&#1090;&#1077;&#1089;&#1100; &#1074;&#1088;&#1072;&#1078;&#1077;&#1089;&#1082;&#1080;&#1093; &#1082;&#1072;&#1084;&#1085;&#1077;&#1081; &#1083;&#1077;&#1090;&#1103;&#1097;&#1080;&#1093; &#1080;&#1079;-&#1079;&#1072; &#1089;&#1090;&#1077;&#1085;&#1099;!</rus>\n           <eng>You are the commander of a catapult crew and your task is to destroy two vertical neighbor parts of the castle wall with a missile. The wall can be destroyed top-down only. Left altimeter shows current altitude of the missile. You have to be careful because the enemy throws its missiles over the wall. You can't fire until the catapult has been charged.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"cockroach\"  title=\"COCKROACH\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1090;&#1072;&#1088;&#1072;&#1082;&#1072;&#1085;&#1086;&#1084; &#1080; &#1087;&#1086;&#1076;&#1073;&#1080;&#1088;&#1072;&#1103; &#1088;&#1072;&#1079;&#1085;&#1099;&#1077; &#1089;&#1098;&#1077;&#1076;&#1086;&#1073;&#1085;&#1099;&#1077; &#1080; &#1085;&#1077;&#1089;&#1098;&#1077;&#1076;&#1086;&#1073;&#1085;&#1099;&#1077; &#1087;&#1088;&#1077;&#1076;&#1084;&#1077;&#1090;&#1099;, &#1085;&#1072;&#1076;&#1086; &#1085;&#1072;&#1081;&#1090;&#1080; &#1074;&#1099;&#1093;&#1086;&#1076; &#1080;&#1079; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1072;.</rus>\n           <eng>A cockroach have to find a way out of the maze</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082;  &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1090;&#1072;&#1088;&#1072;&#1082;&#1072;&#1085;&#1086;&#1084;, &#1087;&#1086;&#1083;&#1079;&#1072;&#1102;&#1097;&#1080;&#1084; &#1074; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1077; &#1080;&#1079; &#1090;&#1088;&#1091;&#1073; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1085;&#1072;&#1081;&#1090;&#1080; &#1074;&#1099;&#1093;&#1086;&#1076; &#1080;&#1079; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1072;. &#1042; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1077; &#1088;&#1072;&#1079;&#1073;&#1088;&#1086;&#1089;&#1072;&#1085;&#1099; &#1088;&#1072;&#1079;&#1083;&#1080;&#1095;&#1085;&#1099;&#1077; &#1089;&#1098;&#1077;&#1076;&#1086;&#1073;&#1085;&#1099;&#1077; &#1087;&#1088;&#1077;&#1076;&#1084;&#1077;&#1090;&#1099;, &#1085;&#1077;&#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1090;&#1072;&#1088;&#1072;&#1082;&#1072;&#1085; &#1084;&#1086;&#1078;&#1077;&#1090; &#1077;&#1089;&#1090;&#1100; &#1073;&#1077;&#1079;&#1073;&#1086;&#1083;&#1077;&#1079;&#1085;&#1077;&#1085;&#1085;&#1086;, &#1085;&#1077;&#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1086;&#1090;&#1085;&#1080;&#1084;&#1072;&#1102;&#1090; &#1086;&#1095;&#1082;&#1080; &#1080; &#1074;&#1088;&#1077;&#1084;&#1103;.</rus>\n           <eng>You are driving a running cockroach in the maze and your task is as soon as possible to find a way out of the maze. There are a lot of scattered eatable things in the maze they increase and decrease game scores, so the game scores are decreased with time.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"coconutsfall\"  title=\"COCONUTS FALL\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1054;&#1073;&#1077;&#1079;&#1100;&#1103;&#1085;&#1072; &#1076;&#1086;&#1083;&#1078;&#1085;&#1072; &#1086;&#1090;&#1073;&#1080;&#1090;&#1100;&#1089;&#1103; &#1086;&#1090; &#1087;&#1088;&#1077;&#1089;&#1083;&#1077;&#1076;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1077;&#1081; &#1086;&#1088;&#1077;&#1093;&#1072;&#1084;&#1080;.</rus>\n           <eng>Save own freedom with coconuts.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1086;&#1073;&#1077;&#1079;&#1100;&#1103;&#1085;&#1086;&#1081;, &#1089;&#1087;&#1072;&#1089;&#1072;&#1102;&#1097;&#1077;&#1081;&#1089;&#1103; &#1085;&#1072; &#1074;&#1077;&#1088;&#1093;&#1091;&#1096;&#1082;&#1072;&#1093; &#1087;&#1072;&#1083;&#1100;&#1084; &#1086;&#1090; &#1082;&#1072;&#1088;&#1072;&#1073;&#1082;&#1072;&#1102;&#1097;&#1080;&#1093;&#1089;&#1103; &#1087;&#1086; &#1085;&#1080;&#1084; &#1095;&#1077;&#1083;&#1086;&#1074;&#1077;&#1095;&#1082;&#1086;&#1074;. &#1054;&#1073;&#1077;&#1079;&#1100;&#1103;&#1085;&#1072; &#1084;&#1086;&#1078;&#1077;&#1090; &#1073;&#1088;&#1086;&#1089;&#1072;&#1090;&#1100; &#1074; &#1095;&#1077;&#1083;&#1086;&#1074;&#1077;&#1095;&#1082;&#1086;&#1074; &#1089;&#1086;&#1073;&#1088;&#1072;&#1085;&#1085;&#1099;&#1077; &#1085;&#1072; &#1087;&#1072;&#1083;&#1100;&#1084;&#1072;&#1093; &#1082;&#1086;&#1082;&#1086;&#1089;&#1099; &#1080; &#1076;&#1086;&#1083;&#1078;&#1085;&#1072; &#1087;&#1088;&#1103;&#1090;&#1072;&#1090;&#1100;&#1089;&#1103; &#1086;&#1090; &#1087;&#1088;&#1086;&#1083;&#1077;&#1090;&#1072;&#1102;&#1097;&#1077;&#1075;&#1086; &#1085;&#1072;&#1076; &#1087;&#1072;&#1083;&#1100;&#1084;&#1072;&#1084;&#1080; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072;.</rus>\n           <eng>You are a monkey and hunters want to catch you. Your task is to save own freedom as long as possible. You can use coconuts to knock men and you have to be careful because a helicopter tries to catch you with a net.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"conecone\"  title=\"CONE! CONE!\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1073;&#1077;&#1083;&#1082;&#1086;&#1081;, &#1089;&#1086;&#1073;&#1077;&#1088;&#1080; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1086;&#1088;&#1077;&#1093;&#1086;&#1074; &#1080; &#1086;&#1090;&#1073;&#1077;&#1081;&#1089;&#1103; &#1086;&#1090; &#1074;&#1086;&#1088;&#1086;&#1085;.</rus>\n           <eng>You are a squirrel defending your supplies against crows.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1073;&#1077;&#1083;&#1082;&#1086;&#1081;, &#1079;&#1072;&#1097;&#1080;&#1097;&#1072;&#1102;&#1097;&#1077;&#1081; &#1086;&#1090; &#1074;&#1086;&#1088;&#1086;&#1085; &#1089;&#1087;&#1088;&#1103;&#1090;&#1072;&#1085;&#1085;&#1099;&#1077; &#1074; &#1076;&#1091;&#1087;&#1083;&#1072;&#1093; &#1076;&#1077;&#1088;&#1077;&#1074;&#1072; &#1079;&#1072;&#1087;&#1072;&#1089;&#1099;. &#1041;&#1077;&#1083;&#1082;&#1072; &#1087;&#1088;&#1099;&#1075;&#1072;&#1077;&#1090; &#1087;&#1086; &#1074;&#1077;&#1090;&#1074;&#1103;&#1084;, &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1077;&#1090; &#1096;&#1080;&#1096;&#1082;&#1080; &#1080; &#1073;&#1088;&#1086;&#1089;&#1072;&#1077;&#1090; &#1080;&#1093; &#1087;&#1086; &#1074;&#1086;&#1088;&#1086;&#1085;&#1072;&#1084;, &#1089;&#1072;&#1076;&#1103;&#1097;&#1080;&#1084;&#1089;&#1103; &#1085;&#1072; &#1074;&#1077;&#1090;&#1074;&#1080;.</rus>\n           <eng>You are a squirrel defending your supplies against crows. You can throw cones at them but be careful because you should keep a distance from a crow.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"firingline\"  title=\"FIRING LINE\" year=\"2004\">\n        <all/>\n\t\t<shooter/>\n\t    \n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1054;&#1085;&#1080; &#1087;&#1088;&#1080;&#1093;&#1086;&#1076;&#1103;&#1090; &#1087;&#1088;&#1103;&#1084;&#1086; &#1080;&#1079; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1086;&#1075;&#1086; &#1082;&#1086;&#1089;&#1084;&#1086;&#1089;&#1072;, &#1072; &#1091; &#1090;&#1077;&#1073;&#1103; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1073;&#1083;&#1072;&#1089;&#1090;&#1077;&#1088;...</rus>\n           <eng>You are the defender of the docking tunnel of your spaceship from space creatures.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; - &#1079;&#1072;&#1097;&#1080;&#1090;&#1085;&#1080;&#1082; &#1089;&#1090;&#1099;&#1082;&#1086;&#1074;&#1086;&#1095;&#1085;&#1086;&#1075;&#1086; &#1096;&#1083;&#1102;&#1079;&#1072;, &#1074; &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1083;&#1077;&#1079;&#1091;&#1090; &#1080;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1085;&#1099;&#1077; &#1090;&#1074;&#1072;&#1088;&#1080;. &#1047;&#1072;&#1076;&#1072;&#1095;&#1072; - &#1085;&#1072;&#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1090;&#1074;&#1072;&#1088;&#1077;&#1081;, &#1087;&#1088;&#1077;&#1078;&#1076;&#1077; &#1095;&#1077;&#1084; &#1080;&#1093; &#1087;&#1086;&#1090;&#1086;&#1082; &#1079;&#1072;&#1093;&#1083;&#1077;&#1089;&#1090;&#1085;&#1077;&#1090; &#1089;&#1090;&#1072;&#1085;&#1094;&#1080;&#1102;.</rus>\n           <eng>You are the defender of the docking tunnel of your spaceship from space creatures. Don&#8217;t allow them to approach to you! Fire! Fire!</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"fisher\"  title=\"FISHER\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1055;&#1086;&#1073;&#1077;&#1076;&#1080; &#1074; &#1095;&#1077;&#1084;&#1087;&#1080;&#1086;&#1085;&#1072;&#1090;&#1077; &#1087;&#1086; &#1088;&#1099;&#1073;&#1086;&#1083;&#1086;&#1074;&#1089;&#1090;&#1074;&#1091;, &#1085;&#1086; &#1087;&#1086;&#1084;&#1085;&#1080; &#1095;&#1090;&#1086; &#1082;&#1088;&#1102;&#1095;&#1082;&#1086;&#1074; &#1084;&#1072;&#1083;&#1086;, &#1072; &#1072;&#1082;&#1091;&#1083; &#1084;&#1085;&#1086;&#1075;&#1086;...</rus>\n           <eng>You are a fisher and have to catch as many as possible fishes.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1088;&#1099;&#1073;&#1072;&#1082;&#1072; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1085;&#1072;&#1083;&#1086;&#1074;&#1080;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1088;&#1099;&#1073;&#1099; &#1087;&#1088;&#1080; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1085;&#1086;&#1084; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1077; &#1082;&#1088;&#1102;&#1095;&#1082;&#1086;&#1074; (&#1080;&#1075;&#1088;&#1086;&#1074;&#1099;&#1093; &#1087;&#1086;&#1087;&#1099;&#1090;&#1086;&#1082;). &#1042; &#1074;&#1086;&#1076;&#1077; &#1087;&#1083;&#1072;&#1074;&#1072;&#1102;&#1090; &#1088;&#1099;&#1073;&#1099;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1093; &#1084;&#1086;&#1078;&#1085;&#1086; &#1083;&#1086;&#1074;&#1080;&#1090;&#1100; &#1080; &#1093;&#1080;&#1097;&#1085;&#1080;&#1082;&#1080;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1084;&#1086;&#1075;&#1091;&#1090; &#1087;&#1077;&#1088;&#1077;&#1082;&#1091;&#1089;&#1099;&#1074;&#1072;&#1090;&#1100; &#1083;&#1077;&#1089;&#1082;&#1091;, &#1087;&#1088;&#1080; &#1101;&#1090;&#1086;&#1084; &#1080;&#1075;&#1088;&#1086;&#1082; &#1090;&#1077;&#1088;&#1103;&#1077;&#1090; &#1086;&#1076;&#1085;&#1091; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1091;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1090;&#1100; &#1075;&#1083;&#1091;&#1073;&#1080;&#1085;&#1086;&#1081; &#1087;&#1086;&#1075;&#1088;&#1091;&#1078;&#1077;&#1085;&#1080;&#1103; &#1082;&#1088;&#1102;&#1095;&#1082;&#1072;, &#1088;&#1072;&#1079;&#1084;&#1072;&#1090;&#1099;&#1074;&#1072;&#1103; &#1083;&#1077;&#1089;&#1082;&#1091; &#1080;&#1083;&#1080; &#1087;&#1086;&#1076;&#1085;&#1080;&#1084;&#1072;&#1103; &#1091;&#1076;&#1086;&#1095;&#1082;&#1091;.</rus>\n           <eng>You are a fisher and have to catch as many as possible fishes. Take care of big predatory fishes, they break your fishing-line.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"hardday\"  title=\"HARD DAY\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1058;&#1103;&#1078;&#1077;&#1083;&#1072; &#1088;&#1072;&#1073;&#1086;&#1090;&#1072; &#1082;&#1091;&#1088;&#1100;&#1077;&#1088;&#1072; &#1074; &#1086;&#1092;&#1080;&#1089;&#1077;, &#1085;&#1086; &#1042;&#1099; &#1085;&#1077; &#1073;&#1086;&#1080;&#1090;&#1077;&#1089;&#1100; &#1090;&#1103;&#1078;&#1077;&#1083;&#1086;&#1081; &#1088;&#1072;&#1073;&#1086;&#1090;&#1099;...</rus>\n           <eng>You are a courier in a big company and your task is to deliver documents inside of an office.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090;&#1077; &#1082;&#1091;&#1088;&#1100;&#1077;&#1088;&#1086;&#1084;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1076;&#1086;&#1089;&#1090;&#1072;&#1074;&#1083;&#1103;&#1090;&#1100; &#1076;&#1086;&#1082;&#1091;&#1084;&#1077;&#1085;&#1090;&#1099; &#1074;&#1085;&#1091;&#1090;&#1088;&#1080; &#1086;&#1092;&#1080;&#1089;&#1072;. &#1042;&#1089;&#1077; &#1073;&#1077;&#1083;&#1099;&#1077; &#1087;&#1072;&#1087;&#1082;&#1080; &#1076;&#1086;&#1083;&#1078;&#1085;&#1099; &#1073;&#1099;&#1090;&#1100; &#1076;&#1086;&#1089;&#1090;&#1072;&#1074;&#1083;&#1077;&#1085;&#1099; &#1085;&#1077;&#1090;&#1077;&#1088;&#1087;&#1077;&#1083;&#1080;&#1074;&#1099;&#1084; &#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1090;&#1077;&#1083;&#1103;&#1084; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1099;&#1089;&#1090;&#1088;&#1077;&#1077;. &#1055;&#1086;&#1084;&#1085;&#1080;&#1090;&#1077;, &#1074;&#1072;&#1096; &#1076;&#1080;&#1088;&#1077;&#1082;&#1090;&#1086;&#1088; &#1073;&#1091;&#1076;&#1077;&#1090; &#1086;&#1095;&#1077;&#1085;&#1100; &#1079;&#1086;&#1083;, &#1077;&#1089;&#1083;&#1080; &#1074;&#1089;&#1090;&#1088;&#1077;&#1090;&#1080;&#1090; &#1074;&#1072;&#1089; &#1096;&#1072;&#1090;&#1072;&#1102;&#1097;&#1080;&#1084;&#1089;&#1103; &#1073;&#1077;&#1079; &#1076;&#1077;&#1083;&#1072;!</rus>\n           <eng>You are a courier in a big company and your task is to deliver documents inside of an office. All white folders must be delivered to recipients as soon as possible. Remember, your manager will be very angry if meet you without a folder.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"hunt\"  title=\"HUNT\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1047;&#1074;&#1077;&#1088;&#1077;&#1081; &#1074; &#1083;&#1077;&#1089;&#1091; &#1084;&#1085;&#1086;&#1075;&#1086;, &#1072; &#1087;&#1072;&#1090;&#1088;&#1086;&#1085;&#1086;&#1074; &#1084;&#1072;&#1083;&#1086;.. &#1090;&#1088;&#1072;&#1090;&#1100; &#1080;&#1093; &#1089; &#1090;&#1086;&#1083;&#1082;&#1086;&#1084;.</rus>\n           <eng>You are a brave hunter and your task is to kill as many as possible animals by 20 bullets.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1086;&#1093;&#1086;&#1090;&#1085;&#1080;&#1082;&#1072; &#1080;  &#1074; &#1085;&#1072;&#1095;&#1072;&#1083;&#1077; &#1080;&#1075;&#1088;&#1099; &#1077;&#1084;&#1091; &#1076;&#1072;&#1077;&#1090;&#1089;&#1103; 20 &#1087;&#1072;&#1090;&#1088;&#1086;&#1085;&#1086;&#1074;. &#1054;&#1085; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1072;&#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1099;&#1093;. &#1055;&#1088;&#1080; &#1087;&#1088;&#1086;&#1087;&#1091;&#1089;&#1082;&#1077; &#1073;&#1077;&#1079; &#1077;&#1076;&#1080;&#1085;&#1086;&#1075;&#1086; &#1074;&#1099;&#1089;&#1090;&#1088;&#1077;&#1083;&#1072; 20 &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1099;&#1093;, &#1091; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1089;&#1085;&#1080;&#1084;&#1072;&#1077;&#1090;&#1089;&#1103; &#1086;&#1076;&#1080;&#1085; &#1087;&#1072;&#1090;&#1088;&#1086;&#1085;. &#1063;&#1072;&#1089;&#1090;&#1086;&#1090;&#1072; &#1087;&#1086;&#1103;&#1074;&#1083;&#1077;&#1085;&#1080;&#1103; &#1079;&#1074;&#1077;&#1088;&#1077;&#1081; &#1085;&#1072; &#1101;&#1082;&#1088;&#1072;&#1085;&#1077; &#1074;&#1086;&#1079;&#1088;&#1072;&#1089;&#1090;&#1072;&#1077;&#1090; &#1089; &#1090;&#1077;&#1095;&#1077;&#1085;&#1080;&#1077;&#1084; &#1080;&#1075;&#1088;&#1086;&#1074;&#1086;&#1075;&#1086; &#1087;&#1088;&#1086;&#1094;&#1077;&#1089;&#1089;&#1072;. &#1047;&#1072; &#1082;&#1072;&#1078;&#1076;&#1086;&#1077; &#1091;&#1073;&#1080;&#1090;&#1086;&#1077; &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1086;&#1077;, &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1085;&#1072;&#1095;&#1080;&#1089;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1086;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1077;&#1085;&#1085;&#1086;&#1077; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1086; &#1080;&#1075;&#1088;&#1086;&#1074;&#1099;&#1093; &#1086;&#1095;&#1082;&#1086;&#1074;. &#1055;&#1088;&#1080; &#1085;&#1072;&#1074;&#1077;&#1076;&#1077;&#1085;&#1080;&#1080; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;&#1072; &#1085;&#1072; &#1073;&#1077;&#1075;&#1091;&#1097;&#1077;&#1077; &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1086;&#1077;, &#1086;&#1085;&#1086; &#1086;&#1089;&#1090;&#1072;&#1085;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; (&#1082;&#1088;&#1086;&#1084;&#1077; &#1074;&#1086;&#1088;&#1086;&#1085;&#1099;) &#1080; &#1086;&#1090;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; &#1072;&#1085;&#1080;&#1084;&#1072;&#1094;&#1080;&#1103; &#1089;&#1090;&#1088;&#1072;&#1093;&#1072;, &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1086;&#1077; &#1089;&#1090;&#1086;&#1080;&#1090; &#1087;&#1086;&#1076; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;&#1086;&#1084;, &#1087;&#1086;&#1082;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082; &#1085;&#1077; &#1074;&#1099;&#1089;&#1090;&#1088;&#1077;&#1083;&#1080;&#1090; &#1080;&#1083;&#1080; &#1085;&#1077; &#1091;&#1073;&#1077;&#1088;&#1077;&#1090; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;.</rus>\n           <eng>You are a brave hunter and your task is to kill as many as possible animals by 20 bullets. If you have missed 20 animals, one your bullet will be removed.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"ironstream\"  title=\"IRON STREAM\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1042;&#1085;&#1080;&#1084;&#1072;&#1085;&#1080;&#1077;! &#1042;&#1085;&#1080;&#1084;&#1072;&#1085;&#1080;&#1077;! &#1042;&#1088;&#1072;&#1075; &#1087;&#1088;&#1086;&#1088;&#1074;&#1072;&#1083; &#1085;&#1072;&#1096;&#1091; &#1086;&#1073;&#1086;&#1088;&#1086;&#1085;&#1091; &#1080; &#1074;&#1093;&#1086;&#1076;&#1080;&#1090; &#1074; &#1085;&#1072;&#1089;&#1077;&#1083;&#1077;&#1085;&#1085;&#1099;&#1081; &#1088;&#1072;&#1081;&#1086;&#1085;! &#1042;&#1072;&#1096; &#1090;&#1072;&#1085;&#1082; - &#1077;&#1076;&#1080;&#1085;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1072;&#1103; &#1085;&#1072;&#1096;&#1072; &#1085;&#1072;&#1076;&#1077;&#1078;&#1076;&#1072;!</rus>\n           <eng>Warning! Warning! The enemy has dashed our protection line and marching into a populated area!</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1085;&#1080;&#1084;&#1072;&#1085;&#1080;&#1077;! &#1042;&#1085;&#1080;&#1084;&#1072;&#1085;&#1080;&#1077;! &#1042;&#1088;&#1072;&#1075; &#1087;&#1088;&#1086;&#1088;&#1074;&#1072;&#1083; &#1085;&#1072;&#1096;&#1091; &#1086;&#1073;&#1086;&#1088;&#1086;&#1085;&#1091; &#1080; &#1074;&#1093;&#1086;&#1076;&#1080;&#1090; &#1074; &#1085;&#1072;&#1089;&#1077;&#1083;&#1077;&#1085;&#1085;&#1099;&#1081; &#1088;&#1072;&#1081;&#1086;&#1085;! &#1042;&#1072;&#1096; &#1090;&#1072;&#1085;&#1082; &#1077;&#1076;&#1080;&#1085;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1072;&#1103; &#1085;&#1072;&#1096;&#1072; &#1085;&#1072;&#1076;&#1077;&#1078;&#1076;&#1072; &#1074; &#1101;&#1090;&#1086;&#1084; &#1088;&#1072;&#1081;&#1086;&#1085;&#1077; &#1080; &#1042;&#1072;&#1096;&#1072; &#1089;&#1074;&#1103;&#1090;&#1072;&#1103; &#1086;&#1073;&#1103;&#1079;&#1072;&#1085;&#1085;&#1086;&#1089;&#1090;&#1100; &#1079;&#1072;&#1097;&#1080;&#1090;&#1080;&#1090;&#1100; &#1077;&#1075;&#1086;. &#1042;&#1099; &#1076;&#1086;&#1083;&#1078;&#1085;&#1099; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1080;&#1090;&#1100;, &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1074;&#1088;&#1072;&#1078;&#1077;&#1089;&#1082;&#1080;&#1093; &#1090;&#1072;&#1085;&#1082;&#1086;&#1074;, &#1085;&#1086; &#1087;&#1088;&#1080; &#1101;&#1090;&#1086;&#1084; &#1089;&#1086;&#1093;&#1088;&#1072;&#1085;&#1080;&#1090;&#1100; &#1074; &#1094;&#1077;&#1083;&#1086;&#1089;&#1090;&#1080; &#1087;&#1086;&#1089;&#1090;&#1088;&#1086;&#1081;&#1082;&#1080;.</rus>\n           <eng>Warning! Warning! The enemy has dashed our protection line and marching into a populated area! Your tank is our only hope in the area and your duty is to defend it. You have to destroy as many enemy tanks as possible but keep buildings untouched.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"kickkick\"  title=\"KICK! KICK!\" year=\"2004\">\n        <all/>\n\t\t<sport/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1090;&#1088;&#1077;&#1084;&#1103; &#1092;&#1091;&#1090;&#1073;&#1086;&#1083;&#1080;&#1089;&#1090;&#1072;&#1084;&#1080;, &#1079;&#1072;&#1082;&#1088;&#1077;&#1087;&#1083;&#1077;&#1085;&#1085;&#1099;&#1084;&#1080; &#1085;&#1072; &#1086;&#1076;&#1085;&#1086;&#1084; &#1074;&#1088;&#1072;&#1097;&#1072;&#1102;&#1097;&#1077;&#1084;&#1089;&#1103; &#1089;&#1090;&#1077;&#1088;&#1078;&#1085;&#1077;.</rus>\n           <eng>You drive footballers fixed on a pivot.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1072; &#1087;&#1086; &#1084;&#1086;&#1090;&#1080;&#1074;&#1072;&#1084; &#1085;&#1072;&#1089;&#1090;&#1086;&#1083;&#1100;&#1085;&#1086;&#1081; &#1080;&#1075;&#1088;&#1099;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1090;&#1088;&#1077;&#1084;&#1103; &#1092;&#1091;&#1090;&#1073;&#1086;&#1083;&#1080;&#1089;&#1090;&#1072;&#1084;&#1080;, &#1079;&#1072;&#1082;&#1088;&#1077;&#1087;&#1083;&#1077;&#1085;&#1085;&#1099;&#1084;&#1080; &#1085;&#1072; &#1086;&#1076;&#1085;&#1086;&#1084; &#1074;&#1088;&#1072;&#1097;&#1072;&#1102;&#1097;&#1077;&#1084;&#1089;&#1103; &#1089;&#1090;&#1077;&#1088;&#1078;&#1085;&#1077;.  &#1053;&#1077;&#1086;&#1073;&#1093;&#1086;&#1076;&#1080;&#1084;&#1086; &#1087;&#1088;&#1086;&#1073;&#1080;&#1090;&#1100; &#1079;&#1072;&#1097;&#1080;&#1090;&#1091; &#1089;&#1086;&#1087;&#1077;&#1088;&#1085;&#1080;&#1082;&#1072; &#1080; &#1079;&#1072;&#1073;&#1080;&#1090;&#1100; &#1084;&#1103;&#1095; &#1074; &#1077;&#1075;&#1086; &#1074;&#1086;&#1088;&#1086;&#1090;&#1072;.</rus>\n           <eng>You drive footballers fixed on a pivot. Your task is to defend own goal and to kick as many balls as possible into the opponent&#8217;s goal.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"lifesaver\"  title=\"LIFESAVER\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1054;&#1075;&#1086;&#1085;&#1100; &#1087;&#1077;&#1088;&#1077;&#1082;&#1088;&#1099;&#1083; &#1074;&#1099;&#1093;&#1086;&#1076;&#1099; &#1080; &#1078;&#1080;&#1090;&#1077;&#1083;&#1080; &#1087;&#1088;&#1099;&#1075;&#1072;&#1102;&#1090; &#1080;&#1079; &#1075;&#1086;&#1088;&#1103;&#1097;&#1080;&#1093; &#1086;&#1082;&#1086;&#1085;, &#1089;&#1087;&#1072;&#1089;&#1080; &#1080;&#1093;!</rus>\n           <eng>Fire! Fire! Fire has occupied the ground level!</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1088;&#1091;&#1082;&#1086;&#1074;&#1086;&#1076;&#1080;&#1090;&#1077;&#1083;&#1103; &#1087;&#1086;&#1078;&#1072;&#1088;&#1085;&#1086;&#1081; &#1082;&#1086;&#1084;&#1072;&#1085;&#1076;&#1099; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1089;&#1087;&#1072;&#1089;&#1090;&#1080; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1078;&#1080;&#1090;&#1077;&#1083;&#1077;&#1081; &#1080;&#1079; &#1075;&#1086;&#1088;&#1103;&#1097;&#1077;&#1075;&#1086; &#1076;&#1086;&#1084;&#1072;. &#1048;&#1079;&#1085;&#1072;&#1095;&#1072;&#1083;&#1100;&#1085;&#1086; &#1075;&#1086;&#1088;&#1080;&#1090; &#1087;&#1077;&#1088;&#1074;&#1099;&#1081; &#1101;&#1090;&#1072;&#1078; &#1076;&#1086;&#1084;&#1072;, &#1089; &#1090;&#1077;&#1095;&#1077;&#1085;&#1080;&#1077;&#1084; &#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1080; &#1086;&#1075;&#1086;&#1085;&#1100; &#1086;&#1093;&#1074;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1090; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1077; &#1101;&#1090;&#1072;&#1078;&#1080; &#1079;&#1076;&#1072;&#1085;&#1080;&#1103;, &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1087;&#1086;&#1078;&#1072;&#1088;&#1085;&#1080;&#1082;&#1072;&#1084;&#1080;, &#1080;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1090;&#1091;&#1096;&#1080;&#1090;&#1100; &#1101;&#1090;&#1072;&#1078;&#1080;, &#1080;&#1089;&#1082;&#1083;&#1102;&#1095;&#1072;&#1103; &#1087;&#1077;&#1088;&#1074;&#1099;&#1081;. &#1057; &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1085;&#1077;&#1075;&#1086; &#1101;&#1090;&#1072;&#1078;&#1072; &#1087;&#1088;&#1099;&#1075;&#1072;&#1102;&#1090; &#1083;&#1102;&#1076;&#1080; &#1080; &#1080;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085;, &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1087;&#1086;&#1078;&#1072;&#1088;&#1085;&#1099;&#1084;&#1080;, &#1091;&#1089;&#1087;&#1077;&#1074;&#1072;&#1090;&#1100; &#1083;&#1086;&#1074;&#1080;&#1090;&#1100; &#1080;&#1093; &#1085;&#1072; &#1073;&#1088;&#1077;&#1079;&#1077;&#1085;&#1090;. &#1055;&#1088;&#1080; &#1089;&#1084;&#1077;&#1088;&#1090;&#1080; &#1086;&#1076;&#1085;&#1086;&#1075;&#1086; &#1087;&#1088;&#1099;&#1075;&#1085;&#1091;&#1074;&#1096;&#1077;&#1075;&#1086;, &#1089;&#1085;&#1080;&#1084;&#1072;&#1077;&#1090;&#1089;&#1103; &#1086;&#1076;&#1085;&#1072; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072; &#1080;&#1075;&#1088;&#1072;&#1102;&#1097;&#1077;&#1075;&#1086;, &#1090;&#1072;&#1082; &#1078;&#1077; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072; &#1089;&#1085;&#1080;&#1084;&#1072;&#1077;&#1090;&#1089;&#1103; &#1087;&#1088;&#1080; &#1087;&#1086;&#1083;&#1085;&#1086;&#1084; &#1089;&#1075;&#1086;&#1088;&#1072;&#1085;&#1080;&#1080; &#1079;&#1076;&#1072;&#1085;&#1080;&#1103;.</rus>\n           <eng>Fire! Fire! Fire has occupied the ground level! You are the chief of a fire brigade and must not let the fire to occupy all building; you can use a water cannon. Hopeless men jump from windows and you have to catch them.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"livebridge\"  title=\"LIVE BRIDGE\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1057;&#1088;&#1086;&#1095;&#1085;&#1072;&#1103; &#1087;&#1086;&#1089;&#1099;&#1083;&#1082;&#1072;, &#1085;&#1086; &#1084;&#1086;&#1089;&#1090; &#1091;&#1078;&#1077; &#1074;&#1090;&#1086;&#1088;&#1091;&#1102; &#1087;&#1103;&#1090;&#1080;&#1083;&#1077;&#1090;&#1082;&#1091; &#1074; &#1088;&#1077;&#1084;&#1086;&#1085;&#1090;&#1077;. &#1055;&#1088;&#1080;&#1076;&#1077;&#1090;&#1089;&#1103; &#1074;&#1086;&#1089;&#1087;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1090;&#1100;&#1089;&#1103; &#1095;&#1077;&#1088;&#1077;&#1087;&#1072;&#1093;&#1072;&#1084;&#1080;...</rus>\n           <eng>You are a porter and your task is to carry cargo from the left riverside to the right riverside.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1085;&#1086;&#1089;&#1080;&#1083;&#1100;&#1097;&#1080;&#1082;&#1086;&#1084;, &#1087;&#1077;&#1088;&#1077;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1102;&#1097;&#1080;&#1084; &#1095;&#1077;&#1088;&#1077;&#1079; &#1088;&#1077;&#1082;&#1091; &#1075;&#1088;&#1091;&#1079;&#1099;. &#1063;&#1077;&#1088;&#1077;&#1079; &#1088;&#1077;&#1082;&#1091; &#1084;&#1086;&#1078;&#1085;&#1086; &#1087;&#1077;&#1088;&#1077;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;&#1089;&#1103; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1087;&#1086; &#1087;&#1083;&#1072;&#1074;&#1072;&#1102;&#1097;&#1080;&#1084; &#1074; &#1085;&#1077;&#1081; &#1095;&#1077;&#1088;&#1077;&#1087;&#1072;&#1093;&#1072;&#1084;, &#1085;&#1099;&#1088;&#1103;&#1102;&#1097;&#1080;&#1084; &#1074;&#1088;&#1077;&#1084;&#1103; &#1086;&#1090; &#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1080; &#1079;&#1072; &#1088;&#1099;&#1073;&#1082;&#1072;&#1084;&#1080;, &#1074;&#1089;&#1087;&#1083;&#1099;&#1074;&#1072;&#1102;&#1097;&#1080;&#1084;&#1080; &#1089;&#1086; &#1076;&#1085;&#1072;.</rus>\n           <eng>You are a porter and your task is to carry cargo from the left riverside to the right riverside but there is not any bridge on the river so you use turtles as a live bridge. Unfortunately it is dangerous to use turtles as a bridge because they catch fishes and dive in the depth from time to time.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"nimble\"  title=\"NIMBLE\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1088;&#1072;&#1073;&#1086;&#1095;&#1080;&#1084;  &#1074; &#1072;&#1101;&#1088;&#1086;&#1087;&#1086;&#1088;&#1090;&#1091;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1088;&#1072;&#1079;&#1086;&#1073;&#1088;&#1072;&#1090;&#1100; &#1087;&#1077;&#1088;&#1077;&#1087;&#1091;&#1090;&#1072;&#1085;&#1085;&#1099;&#1081; &#1073;&#1072;&#1075;&#1072;&#1078; &#1085;&#1072; &#1083;&#1077;&#1085;&#1090;&#1072;&#1093; &#1090;&#1088;&#1072;&#1085;&#1089;&#1087;&#1086;&#1088;&#1090;&#1077;&#1088;&#1072;.</rus>\n           <eng>You are an airport loader and your task is to sort baggage.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1088;&#1072;&#1073;&#1086;&#1095;&#1080;&#1084;  &#1074; &#1072;&#1101;&#1088;&#1086;&#1087;&#1086;&#1088;&#1090;&#1091;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1088;&#1072;&#1079;&#1086;&#1073;&#1088;&#1072;&#1090;&#1100; &#1087;&#1077;&#1088;&#1077;&#1087;&#1091;&#1090;&#1072;&#1085;&#1085;&#1099;&#1081; &#1073;&#1072;&#1075;&#1072;&#1078; &#1085;&#1072; &#1083;&#1077;&#1085;&#1090;&#1072;&#1093; &#1090;&#1088;&#1072;&#1085;&#1089;&#1087;&#1086;&#1088;&#1090;&#1077;&#1088;&#1072; &#1076;&#1086; &#1090;&#1086;&#1075;&#1086; &#1082;&#1072;&#1082; &#1090;&#1088;&#1072;&#1085;&#1089;&#1087;&#1086;&#1088;&#1090;&#1077;&#1088;&#1099; &#1087;&#1077;&#1088;&#1077;&#1087;&#1086;&#1083;&#1085;&#1103;&#1090;&#1089;&#1103;.</rus>\n           <eng>You are an airport loader and your task is to sort baggage. You have to take color bags and place them on the conveyer having the same color as the bag. Bags should not overload conveyers.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"opthunderclap\"  title=\"OPERATION THUNDERCLAP\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1087;&#1080;&#1083;&#1086;&#1090;&#1072; &#1073;&#1086;&#1077;&#1074;&#1086;&#1075;&#1086; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072;, &#1074; &#1079;&#1072;&#1076;&#1072;&#1095;&#1091; &#1082;&#1086;&#1090;&#1086;&#1088;&#1086;&#1075;&#1086; &#1074;&#1093;&#1086;&#1076;&#1080;&#1090; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077;&#1075;&#1086; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1072; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1086;&#1074; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;.</rus>\n           <eng>You are a pilot of a military copter and your task is to kill as many as possible enemy copters.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1087;&#1080;&#1083;&#1086;&#1090;&#1072; &#1073;&#1086;&#1077;&#1074;&#1086;&#1075;&#1086; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072;, &#1074; &#1079;&#1072;&#1076;&#1072;&#1095;&#1091; &#1082;&#1086;&#1090;&#1086;&#1088;&#1086;&#1075;&#1086; &#1074;&#1093;&#1086;&#1076;&#1080;&#1090; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077;&#1075;&#1086; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1072; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1086;&#1074; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;. &#1042;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1099; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072; &#1089;&#1083;&#1091;&#1095;&#1072;&#1081;&#1085;&#1099;&#1084; &#1086;&#1073;&#1088;&#1072;&#1079;&#1086;&#1084; &#1087;&#1086;&#1103;&#1074;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1085;&#1072; &#1101;&#1082;&#1088;&#1072;&#1085;&#1077; &#1080; &#1087;&#1077;&#1088;&#1077;&#1084;&#1077;&#1097;&#1072;&#1102;&#1090;&#1089;&#1103; &#1087;&#1086; &#1088;&#1072;&#1079;&#1083;&#1080;&#1095;&#1085;&#1099;&#1084; &#1090;&#1088;&#1072;&#1077;&#1082;&#1090;&#1086;&#1088;&#1080;&#1103;&#1084;. &#1059;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072; &#1086;&#1089;&#1091;&#1097;&#1077;&#1089;&#1090;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1087;&#1091;&#1090;&#1077;&#1084; &#1085;&#1072;&#1074;&#1077;&#1076;&#1077;&#1085;&#1080;&#1103; &#1085;&#1072; &#1085;&#1077;&#1075;&#1086; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;&#1072; &#1080; &#1085;&#1072;&#1078;&#1072;&#1090;&#1080;&#1103; &#1085;&#1072; &#1075;&#1072;&#1096;&#1077;&#1090;&#1082;&#1091; (&#1082;&#1085;&#1086;&#1087;&#1082;&#1072; &#171;&#1054;&#1075;&#1086;&#1085;&#1100;&#187;). &#1053;&#1077;&#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1080; &#1090;&#1072;&#1082; &#1078;&#1077; &#1084;&#1086;&#1075;&#1091;&#1090; &#1074;&#1077;&#1089;&#1090;&#1080; &#1086;&#1075;&#1086;&#1085;&#1100; &#1087;&#1086; &#1080;&#1075;&#1088;&#1086;&#1082;&#1091;, &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1072;&#1077;&#1090;&#1089;&#1103;, &#1077;&#1089;&#1083;&#1080; &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1102;&#1097;&#1080;&#1081; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082; &#1085;&#1077; &#1073;&#1091;&#1076;&#1077;&#1090; &#1089;&#1074;&#1086;&#1077;&#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1085;&#1086; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;. &#1047;&#1072; &#1082;&#1072;&#1078;&#1076;&#1086;&#1075;&#1086; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;&#1085;&#1086;&#1075;&#1086; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072; &#1085;&#1072;&#1095;&#1080;&#1089;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; 10 &#1080;&#1075;&#1088;&#1086;&#1074;&#1099;&#1093; &#1086;&#1095;&#1082;&#1086;&#1074;.</rus>\n           <eng>You are a pilot of a military copter and your task is to kill as many as possible enemy copters.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"oysterbank\"  title=\"OYSTER BANK\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1085;&#1099;&#1088;&#1103;&#1083;&#1100;&#1097;&#1080;&#1082;&#1086;&#1084;, &#1086;&#1093;&#1086;&#1090;&#1103;&#1097;&#1080;&#1084;&#1089;&#1103; &#1079;&#1072; &#1078;&#1077;&#1084;&#1095;&#1091;&#1078;&#1080;&#1085;&#1072;&#1084;&#1080; &#1085;&#1072; &#1084;&#1086;&#1088;&#1089;&#1082;&#1086;&#1084; &#1076;&#1085;&#1077;.</rus>\n           <eng>You are a diver gathering pearls.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1085;&#1099;&#1088;&#1103;&#1083;&#1100;&#1097;&#1080;&#1082;&#1086;&#1084;, &#1086;&#1093;&#1086;&#1090;&#1103;&#1097;&#1080;&#1084;&#1089;&#1103; &#1079;&#1072; &#1078;&#1077;&#1084;&#1095;&#1091;&#1078;&#1080;&#1085;&#1072;&#1084;&#1080; &#1085;&#1072; &#1084;&#1086;&#1088;&#1089;&#1082;&#1086;&#1084; &#1076;&#1085;&#1077;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1072;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1090;&#1100; &#1083;&#1086;&#1074;&#1094;&#1072; &#1082; &#1090;&#1077;&#1084; &#1088;&#1072;&#1082;&#1086;&#1074;&#1080;&#1085;&#1072;&#1084;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1099;, &#1089;&#1083;&#1077;&#1076;&#1080;&#1090;&#1100; &#1079;&#1072; &#1077;&#1075;&#1086; &#1079;&#1072;&#1087;&#1072;&#1089;&#1086;&#1084; &#1082;&#1080;&#1089;&#1083;&#1086;&#1088;&#1086;&#1076;&#1072; &#1080; &#1073;&#1077;&#1088;&#1077;&#1095;&#1100; &#1086;&#1090; &#1072;&#1082;&#1091;&#1083;</rus>\n           <eng>You are a diver gathering pearls. You should collect as many pearls as possible. You have to avoid collisions with a shark. The oxygen cylinder is limited so you have to look after its level.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"ravenscheese\"  title=\"RAVEN'S CHEESE\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1042;&#1086;&#1088;&#1086;&#1085;&#1077; &#1041;&#1086;&#1075; &#1087;&#1086;&#1089;&#1083;&#1072;&#1083; &#1082;&#1091;&#1089;&#1086;&#1095;&#1077;&#1082; &#1089;&#1099;&#1088;&#1072;, &#1085;&#1086; &#1090;&#1088;&#1091;&#1076;&#1085;&#1086; &#1073;&#1091;&#1076;&#1077;&#1090; &#1083;&#1080;&#1089;&#1077; &#1077;&#1089;&#1083;&#1080; &#1094;&#1077;&#1083;&#1072;&#1103; &#1089;&#1090;&#1072;&#1103; &#1074;&#1086;&#1088;&#1086;&#1085; &#1073;&#1086;&#1084;&#1073;&#1080;&#1090; &#1077;&#1105; &#1089;&#1099;&#1088;&#1086;&#1084;...</rus>\n           <eng>You drive a fox and your task to catch cheeses that throwed by ravens.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1083;&#1080;&#1089;&#1099;, &#1083;&#1086;&#1074;&#1103;&#1097;&#1077;&#1081; &#1082;&#1091;&#1089;&#1082;&#1080; &#1089;&#1099;&#1088;&#1072;, &#1073;&#1088;&#1086;&#1089;&#1072;&#1077;&#1084;&#1086;&#1075;&#1086; &#1074;&#1086;&#1088;&#1086;&#1085;&#1072;&#1084;&#1080;. &#1047;&#1072;&#1076;&#1072;&#1095;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1085;&#1072;&#1083;&#1086;&#1074;&#1080;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1091;&#1089;&#1082;&#1086;&#1074; &#1089;&#1099;&#1088;&#1072;. &#1048;&#1075;&#1088;&#1072; &#1085;&#1077; &#1080;&#1084;&#1077;&#1077;&#1090; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1080;&#1103; &#1087;&#1086; &#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1080;, &#1085;&#1086; &#1080;&#1084;&#1077;&#1077;&#1090; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1080;&#1077; &#1087;&#1086; &#1084;&#1072;&#1082;&#1089;&#1080;&#1084;&#1072;&#1083;&#1100;&#1085;&#1086;&#1084;&#1091; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1091; &#1087;&#1088;&#1086;&#1087;&#1091;&#1097;&#1077;&#1085;&#1085;&#1099;&#1093; &#1089;&#1099;&#1088;&#1086;&#1074;. &#1053;&#1072; &#1074;&#1077;&#1090;&#1074;&#1103;&#1093; &#1076;&#1077;&#1088;&#1077;&#1074;&#1100;&#1077;&#1074; &#1087;&#1086;&#1103;&#1074;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1074;&#1086;&#1088;&#1086;&#1085;&#1099; &#1089; &#1089;&#1099;&#1088;&#1086;&#1084; &#1074; &#1082;&#1083;&#1102;&#1074;&#1077;, &#1080;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1091;&#1075;&#1072;&#1076;&#1072;&#1090;&#1100; &#1084;&#1086;&#1084;&#1077;&#1085;&#1090; &#1073;&#1088;&#1086;&#1089;&#1082;&#1072; &#1089;&#1099;&#1088;&#1072; &#1080; &#1087;&#1086;&#1089;&#1090;&#1072;&#1074;&#1080;&#1090;&#1100; &#1083;&#1080;&#1089;&#1091; &#1074; &#1087;&#1086;&#1079;&#1080;&#1094;&#1080;&#1102;, &#1087;&#1088;&#1080; &#1082;&#1086;&#1090;&#1086;&#1088;&#1086;&#1081; &#1089;&#1099;&#1088; &#1073;&#1091;&#1076;&#1077;&#1090; &#1073;&#1088;&#1086;&#1096;&#1077;&#1085; &#1077;&#1081; &#1074; &#1087;&#1072;&#1089;&#1090;&#1100;. &#1042;&#1089;&#1077;&#1075;&#1086; &#1080;&#1084;&#1077;&#1077;&#1090;&#1089;&#1103; &#1095;&#1077;&#1090;&#1099;&#1088;&#1077; &#1087;&#1086;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1103; &#1083;&#1080;&#1089;&#1099;. &#1048;&#1075;&#1088;&#1086;&#1082;&#1091; &#1089;&#1083;&#1077;&#1076;&#1091;&#1077;&#1090; &#1091;&#1095;&#1080;&#1090;&#1099;&#1074;&#1072;&#1090;&#1100;, &#1095;&#1090;&#1086; &#1083;&#1080;&#1089;&#1072; &#1085;&#1077; &#1084;&#1086;&#1078;&#1077;&#1090; &#1087;&#1086;&#1089;&#1090;&#1086;&#1103;&#1085;&#1085;&#1086; &#1089;&#1090;&#1086;&#1103;&#1090;&#1100; &#1085;&#1072; &#1079;&#1072;&#1076;&#1085;&#1080;&#1093; &#1083;&#1072;&#1087;&#1072;&#1093; &#1080; &#1095;&#1077;&#1088;&#1077;&#1079; &#1082;&#1072;&#1082;&#1086;&#1077; &#1090;&#1086; &#1074;&#1088;&#1077;&#1084;&#1103; &#1086;&#1087;&#1091;&#1089;&#1082;&#1072;&#1077;&#1090;&#1089;&#1103;.  &#1045;&#1089;&#1083;&#1080; &#1074;&#1086;&#1088;&#1086;&#1085;&#1072; &#1076;&#1086;&#1093;&#1086;&#1076;&#1080;&#1090; &#1076;&#1086; &#1082;&#1088;&#1072;&#1103; &#1074;&#1077;&#1090;&#1082;&#1080;, &#1072; &#1083;&#1080;&#1089;&#1072; &#1085;&#1077; &#1075;&#1086;&#1090;&#1086;&#1074;&#1072; &#1087;&#1086;&#1081;&#1084;&#1072;&#1090;&#1100; &#1089;&#1099;&#1088;, &#1090;&#1086; &#1088;&#1072;&#1079;&#1076;&#1072;&#1077;&#1090;&#1089;&#1103; &#1082;&#1072;&#1088;&#1082;&#1072;&#1085;&#1100;&#1077; &#1080; &#1089;&#1099;&#1088; &#1087;&#1072;&#1076;&#1072;&#1077;&#1090; &#1085;&#1072; &#1079;&#1077;&#1084;&#1083;&#1102;. &#1057; &#1082;&#1088;&#1072;&#1103; &#1101;&#1082;&#1088;&#1072;&#1085;&#1072; &#1074;&#1099;&#1073;&#1077;&#1075;&#1072;&#1077;&#1090; &#1084;&#1099;&#1096;&#1100; &#1080; &#1091;&#1085;&#1086;&#1089;&#1080;&#1090; &#1082;&#1091;&#1089;&#1086;&#1082; &#1089;&#1099;&#1088;&#1072;, &#1087;&#1088;&#1080; &#1101;&#1090;&#1086;&#1084; &#1091; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1079;&#1072;&#1073;&#1080;&#1088;&#1072;&#1077;&#1090;&#1089;&#1103; &#1086;&#1076;&#1085;&#1072; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072;. &#1057;&#1082;&#1086;&#1088;&#1086;&#1089;&#1090;&#1100; &#1087;&#1086;&#1103;&#1074;&#1083;&#1077;&#1085;&#1080;&#1103; &#1074;&#1086;&#1088;&#1086;&#1085; &#1089;&#1086; &#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1077;&#1084; &#1091;&#1074;&#1077;&#1083;&#1080;&#1095;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103;, &#1085;&#1086; &#1087;&#1088;&#1080; &#1076;&#1086;&#1089;&#1090;&#1080;&#1078;&#1077;&#1085;&#1080;&#1080; &#1080;&#1075;&#1088;&#1086;&#1082;&#1086;&#1084; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1072; &#1086;&#1095;&#1082;&#1086;&#1074; &#1082;&#1088;&#1072;&#1090;&#1085;&#1086;&#1075;&#1086; 50, &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1086;  &#1087;&#1086;&#1087;&#1099;&#1090;&#1086;&#1082; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1074;&#1086;&#1089;&#1089;&#1090;&#1072;&#1085;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103;.  &#1042;&#1099;&#1080;&#1075;&#1088;&#1099;&#1096;&#1085;&#1072;&#1103; &#1082;&#1072;&#1088;&#1090;&#1080;&#1085;&#1082;&#1072; &#1073;&#1091;&#1076;&#1077;&#1090; &#1087;&#1086;&#1082;&#1072;&#1079;&#1072;&#1085;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1087;&#1088;&#1080; &#1085;&#1072;&#1073;&#1088;&#1072;&#1085;&#1085;&#1086;&#1084; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1077; &#1089;&#1099;&#1088;&#1086;&#1074; &#1085;&#1077; &#1084;&#1077;&#1085;&#1100;&#1096;&#1077; 100. &#1055;&#1088;&#1080; &#1076;&#1086;&#1089;&#1090;&#1080;&#1078;&#1077;&#1085;&#1080;&#1080; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1072; &#1086;&#1095;&#1082;&#1086;&#1074; &#1082;&#1088;&#1072;&#1090;&#1085;&#1086;&#1075;&#1086; 50, &#1089;&#1082;&#1086;&#1088;&#1086;&#1089;&#1090;&#1100; &#1087;&#1086;&#1103;&#1074;&#1083;&#1077;&#1085;&#1080;&#1103; &#1074;&#1086;&#1088;&#1086;&#1085; &#1091;&#1084;&#1077;&#1085;&#1100;&#1096;&#1072;&#1077;&#1090;&#1089;&#1103;.</rus>\n           <eng>You drive a fox and your task to catch cheeses that throwed by ravens.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"searovers\"  title=\"SEA ROVERS\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1040; &#1085;&#1077; &#1087;&#1086;&#1086;&#1093;&#1086;&#1090;&#1080;&#1090;&#1100;&#1089;&#1103; &#1083;&#1080; &#1089;&#1086; &#1089;&#1082;&#1091;&#1082;&#1080; &#1085;&#1072; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080; &#1074; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1086;&#1084; &#1084;&#1086;&#1088;&#1077;? &#1040; &#1087;&#1086;&#1095;&#1077;&#1084;&#1091; &#1073;&#1099; &#1080; &#1085;&#1077;&#1090;?</rus>\n           <eng>You are a pirate hunting for cargo ships.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1087;&#1080;&#1088;&#1072;&#1090;&#1089;&#1082;&#1080;&#1084; &#1087;&#1072;&#1088;&#1091;&#1089;&#1085;&#1099;&#1084; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1077;&#1084; &#1080;  &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1079;&#1072;&#1093;&#1074;&#1072;&#1090;&#1099;&#1074;&#1072;&#1090;&#1100; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080;, &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1103; &#1074;&#1089;&#1090;&#1088;&#1077;&#1095;&#1080; &#1089; &#1074;&#1086;&#1077;&#1085;&#1085;&#1099;&#1084;&#1080; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1103;&#1084;&#1080;. &#1042;&#1089;&#1077; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080; &#1074;&#1086;&#1086;&#1088;&#1091;&#1078;&#1077;&#1085;&#1099; &#1080; &#1076;&#1077;&#1083;&#1103;&#1090;&#1089;&#1103; &#1085;&#1072; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077;, &#1074;&#1086;&#1077;&#1085;&#1085;&#1099;&#1077; &#1080; &#1087;&#1088;&#1086;&#1095;&#1080;&#1077; (&#1073;&#1086;&#1090;&#1099;). &#1050;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080; &#1086;&#1090;&#1083;&#1080;&#1095;&#1072;&#1102;&#1090;&#1089;&#1103; &#1090;&#1072;&#1082;&#1078;&#1077; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1086;&#1084; &#1101;&#1085;&#1077;&#1088;&#1075;&#1080;&#1080; &#1080;, &#1089;&#1086;&#1086;&#1090;&#1074;&#1077;&#1090;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1086;, &#1095;&#1080;&#1089;&#1083;&#1086;&#1084; &#1073;&#1086;&#1088;&#1090;&#1086;&#1074;&#1099;&#1093; &#1079;&#1072;&#1083;&#1087;&#1086;&#1074;, &#1085;&#1077;&#1086;&#1073;&#1093;&#1086;&#1076;&#1080;&#1084;&#1099;&#1093; &#1076;&#1083;&#1103; &#1080;&#1093; &#1087;&#1086;&#1090;&#1086;&#1087;&#1083;&#1077;&#1085;&#1080;&#1103;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1072;&#1087;&#1072;&#1076;&#1072;&#1090;&#1100; &#1085;&#1072; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080; &#1080; &#1086;&#1087;&#1072;&#1089;&#1072;&#1090;&#1100;&#1089;&#1103; &#1074;&#1086;&#1077;&#1085;&#1085;&#1099;&#1093;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1084;&#1086;&#1075;&#1091;&#1090; &#1076;&#1072;&#1090;&#1100; &#1086;&#1090;&#1087;&#1086;&#1088;. &#1055;&#1088;&#1086;&#1095;&#1080;&#1077; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080;  &#1090;&#1072;&#1082;&#1078;&#1077; &#1084;&#1086;&#1075;&#1091;&#1090; &#1073;&#1099;&#1090;&#1100; &#1084;&#1080;&#1096;&#1077;&#1085;&#1100;&#1102; &#1076;&#1083;&#1103; &#1087;&#1091;&#1096;&#1077;&#1082; &#1087;&#1080;&#1088;&#1072;&#1090;&#1089;&#1082;&#1086;&#1075;&#1086; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1103;, &#1085;&#1086; &#1101;&#1090;&#1086; &#1085;&#1077; &#1087;&#1088;&#1080;&#1085;&#1077;&#1089;&#1077;&#1090; &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1084;&#1085;&#1086;&#1075;&#1086; &#1086;&#1095;&#1082;&#1086;&#1074;.</rus>\n           <eng>You are a pirate hunting for cargo ships. When you have damaged a cargo ship (it has three-cornered sail), you should stop own ship near it to enable your crew to rob the ship. You have to avoid collisions with battleships. Good luck, captain!</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"searoad\"  title=\"SEA ROAD\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n        <racing/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1089;&#1087;&#1086;&#1088;&#1090;&#1080;&#1074;&#1085;&#1099;&#1084; &#1082;&#1072;&#1090;&#1077;&#1088;&#1086;&#1084;, &#1087;&#1088;&#1080;&#1085;&#1080;&#1084;&#1072;&#1102;&#1097;&#1080;&#1084; &#1091;&#1095;&#1072;&#1089;&#1090;&#1080;&#1077; &#1074; &#1089;&#1083;&#1072;&#1083;&#1086;&#1084;&#1077; &#1085;&#1072; &#1086;&#1078;&#1080;&#1074;&#1083;&#1077;&#1085;&#1085;&#1086;&#1084; &#1084;&#1086;&#1088;&#1089;&#1082;&#1086;&#1084; &#1087;&#1091;&#1090;&#1080;.</rus>\n           <eng>You are a driver of a speedboat.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1089;&#1087;&#1086;&#1088;&#1090;&#1080;&#1074;&#1085;&#1099;&#1084; &#1082;&#1072;&#1090;&#1077;&#1088;&#1086;&#1084;, &#1087;&#1088;&#1080;&#1085;&#1080;&#1084;&#1072;&#1102;&#1097;&#1080;&#1084; &#1091;&#1095;&#1072;&#1089;&#1090;&#1080;&#1077; &#1074; &#1089;&#1083;&#1072;&#1083;&#1086;&#1084;&#1077; &#1085;&#1072; &#1086;&#1078;&#1080;&#1074;&#1083;&#1077;&#1085;&#1085;&#1086;&#1084; &#1084;&#1086;&#1088;&#1089;&#1082;&#1086;&#1084; &#1087;&#1091;&#1090;&#1080;. &#1044;&#1074;&#1080;&#1075;&#1072;&#1103;&#1089;&#1100; &#1087;&#1086; &#1076;&#1080;&#1089;&#1090;&#1072;&#1085;&#1094;&#1080;&#1080;, &#1080;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1087;&#1088;&#1086;&#1093;&#1086;&#1076;&#1080;&#1090;&#1100; &#1095;&#1077;&#1088;&#1077;&#1079; &#1074;&#1089;&#1090;&#1088;&#1077;&#1095;&#1085;&#1099;&#1077; &#1074;&#1086;&#1088;&#1086;&#1090;&#1072;, &#1074;&#1088;&#1077;&#1084;&#1103; &#1087;&#1088;&#1086;&#1093;&#1086;&#1078;&#1076;&#1077;&#1085;&#1080;&#1103; &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1093; &#1074;&#1083;&#1080;&#1103;&#1077;&#1090; &#1085;&#1072; &#1079;&#1072;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1084;&#1099;&#1077; &#1086;&#1095;&#1082;&#1080;.</rus>\n           <eng>You are a driver of a speedboat and your task is to pass as many gates as possible during limited time. You should avoid collisions with other ships.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"mobilesheriff\"  title=\"MOBILE SHERIFF\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1096;&#1077;&#1088;&#1080;&#1092;&#1086;&#1084;, &#1086;&#1089;&#1074;&#1086;&#1073;&#1086;&#1078;&#1076;&#1072;&#1102;&#1097;&#1080;&#1084; &#1084;&#1072;&#1083;&#1077;&#1085;&#1100;&#1082;&#1080;&#1081; &#1090;&#1077;&#1093;&#1072;&#1089;&#1089;&#1082;&#1080;&#1081; &#1075;&#1086;&#1088;&#1086;&#1076; &#1086;&#1090; &#1073;&#1072;&#1085;&#1076;&#1099;.</rus>\n           <eng>You are a brave sheriff of Wild West who is releasing a small town from a band.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1096;&#1077;&#1088;&#1080;&#1092;&#1086;&#1084;, &#1086;&#1089;&#1074;&#1086;&#1073;&#1086;&#1078;&#1076;&#1072;&#1102;&#1097;&#1080;&#1084; &#1084;&#1072;&#1083;&#1077;&#1085;&#1100;&#1082;&#1080;&#1081; &#1090;&#1077;&#1093;&#1072;&#1089;&#1089;&#1082;&#1080;&#1081; &#1075;&#1086;&#1088;&#1086;&#1076; &#1086;&#1090; &#1073;&#1072;&#1085;&#1076;&#1099;. &#1063;&#1080;&#1089;&#1083;&#1086; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1086;&#1074; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1086;, &#1085;&#1086; &#1074; &#1083;&#1080;&#1094;&#1086; &#1080;&#1093; &#1085;&#1080;&#1082;&#1090;&#1086; &#1085;&#1077; &#1079;&#1085;&#1072;&#1077;&#1090;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1086;&#1090;&#1083;&#1080;&#1095;&#1080;&#1090;&#1100; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1086;&#1074; &#1086;&#1090; &#1084;&#1080;&#1088;&#1085;&#1099;&#1093; &#1075;&#1086;&#1088;&#1086;&#1078;&#1072;&#1085; &#1080; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1080;&#1090;&#1100; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1086;&#1074;. &#1042; &#1087;&#1088;&#1086;&#1077;&#1084;&#1072;&#1093; &#1086;&#1082;&#1086;&#1085; &#1080; &#1076;&#1074;&#1077;&#1088;&#1077;&#1081; &#1087;&#1077;&#1088;&#1080;&#1086;&#1076;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1087;&#1086;&#1103;&#1074;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1080; &#1087;&#1088;&#1103;&#1095;&#1091;&#1090;&#1089;&#1103; &#1095;&#1077;&#1083;&#1086;&#1074;&#1077;&#1095;&#1082;&#1080;. &#1063;&#1077;&#1083;&#1086;&#1074;&#1077;&#1095;&#1082;&#1080; &#1084;&#1086;&#1075;&#1091;&#1090; &#1073;&#1099;&#1090;&#1100; &#1084;&#1080;&#1088;&#1085;&#1099;&#1084;&#1080; &#1075;&#1086;&#1088;&#1086;&#1078;&#1072;&#1085;&#1072;&#1084;&#1080; &#1080;&#1083;&#1080; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1072;&#1084;&#1080;. &#1041;&#1072;&#1085;&#1076;&#1080;&#1090; &#1074;&#1085;&#1077;&#1096;&#1085;&#1077; &#1086;&#1090;&#1083;&#1080;&#1095;&#1072;&#1077;&#1090;&#1089;&#1103; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1090;&#1077;&#1084;, &#1095;&#1090;&#1086; &#1085;&#1072;&#1095;&#1080;&#1085;&#1072;&#1077;&#1090; &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1090;&#1100; &#1074; &#1096;&#1077;&#1088;&#1080;&#1092;&#1072;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1090;&#1100; &#1087;&#1077;&#1088;&#1074;&#1099;&#1084;, &#1088;&#1080;&#1089;&#1082;&#1091;&#1103; &#1091;&#1073;&#1080;&#1090;&#1100; &#1075;&#1086;&#1088;&#1086;&#1078;&#1072;&#1085;&#1080;&#1085;&#1072; &#1080;&#1083;&#1080; &#1078;&#1076;&#1072;&#1090;&#1100; &#1087;&#1086;&#1082;&#1072; &#1087;&#1086; &#1085;&#1077;&#1084;&#1091; &#1085;&#1077; &#1085;&#1072;&#1095;&#1085;&#1091;&#1090; &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1090;&#1100; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1099;. &#1041;&#1072;&#1085;&#1076;&#1080;&#1090; &#1076;&#1077;&#1083;&#1072;&#1077;&#1090; &#1088;&#1072;&#1079;&#1085;&#1086;&#1077; &#1095;&#1080;&#1089;&#1083;&#1086; &#1074;&#1099;&#1089;&#1090;&#1088;&#1077;&#1083;&#1086;&#1074;, &#1085;&#1086; &#1091;&#1073;&#1080;&#1090;&#1100; &#1096;&#1077;&#1088;&#1080;&#1092;&#1072; &#1084;&#1086;&#1078;&#1077;&#1090; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1090;&#1088;&#1077;&#1090;&#1100;&#1080;&#1084; &#1074;&#1099;&#1089;&#1090;&#1088;&#1077;&#1083;&#1086;&#1084; &#1087;&#1086;&#1076;&#1088;&#1103;&#1076;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1091;&#1089;&#1087;&#1077;&#1090;&#1100; &#1079;&#1072; &#1101;&#1090;&#1086; &#1074;&#1088;&#1077;&#1084;&#1103; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;&#1080;&#1090;&#1100;&#1089;&#1103; &#1080; &#1074;&#1099;&#1089;&#1090;&#1088;&#1077;&#1083;&#1080;&#1090;&#1100;. &#1059;&#1073;&#1080;&#1074; &#1084;&#1080;&#1088;&#1085;&#1086;&#1075;&#1086; &#1075;&#1086;&#1088;&#1086;&#1078;&#1072;&#1085;&#1080;&#1085;&#1072;, &#1080;&#1075;&#1088;&#1086;&#1082; &#1090;&#1077;&#1088;&#1103;&#1077;&#1090; &#1086;&#1076;&#1085;&#1091; &#1080;&#1075;&#1088;&#1086;&#1074;&#1091;&#1102; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1091;. &#1059;&#1073;&#1080;&#1074; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1072;, &#1080;&#1075;&#1088;&#1086;&#1082; &#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1077;&#1090; &#1086;&#1095;&#1082;&#1080;.</rus>\n           <eng>You are a brave sheriff of Wild West who is releasing a small town from a band. The number of the bandits is known but you don&#8217;t know their faces so you must be careful because there are a lot of   inhabitants in the town and you must not kill them (we recommend you to wait an unkind action and don&#8217;t shoot before).</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"smashingkick\"  title=\"SMASHING KICK\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n        <sport/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082;  &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1090;&#1088;&#1077;&#1085;&#1080;&#1088;&#1091;&#1102;&#1097;&#1080;&#1084;&#1089;&#1103; &#1092;&#1091;&#1090;&#1073;&#1086;&#1083;&#1080;&#1089;&#1090;&#1086;&#1084; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1076;&#1086;&#1074;&#1077;&#1089;&#1090;&#1080; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1084;&#1103;&#1095;&#1077;&#1081; &#1076;&#1086; &#1074;&#1086;&#1088;&#1086;&#1090;, &#1085;&#1077; &#1088;&#1086;&#1085;&#1103;&#1103; &#1080;&#1093; &#1085;&#1072; &#1079;&#1077;&#1084;&#1083;&#1102;.</rus>\n           <eng>You are a training footballer and your task is to kick as many as possible balls into the goal.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082;  &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1090;&#1088;&#1077;&#1085;&#1080;&#1088;&#1091;&#1102;&#1097;&#1080;&#1084;&#1089;&#1103; &#1092;&#1091;&#1090;&#1073;&#1086;&#1083;&#1080;&#1089;&#1090;&#1086;&#1084; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1076;&#1086;&#1074;&#1077;&#1089;&#1090;&#1080; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1084;&#1103;&#1095;&#1077;&#1081; &#1076;&#1086; &#1074;&#1086;&#1088;&#1086;&#1090;, &#1085;&#1077; &#1088;&#1086;&#1085;&#1103;&#1103; &#1080;&#1093; &#1085;&#1072; &#1079;&#1077;&#1084;&#1083;&#1102;. &#1058;&#1088;&#1077;&#1085;&#1077;&#1088; &#1089; &#1091;&#1084;&#1077;&#1085;&#1100;&#1096;&#1072;&#1102;&#1097;&#1080;&#1084;&#1089;&#1103; &#1080;&#1085;&#1090;&#1077;&#1088;&#1074;&#1072;&#1083;&#1086;&#1084; &#1087;&#1086;&#1076;&#1072;&#1077;&#1090; &#1084;&#1103;&#1095;&#1080; &#1080; &#1080;&#1075;&#1088;&#1086;&#1082;, &#1091;&#1076;&#1077;&#1088;&#1078;&#1080;&#1074;&#1072;&#1103; &#1084;&#1103;&#1095; &#1074; &#1074;&#1086;&#1079;&#1076;&#1091;&#1093;&#1077; &#1087;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1085;&#1086;&#1075; &#1080; &#1075;&#1086;&#1083;&#1086;&#1074;&#1099;, &#1076;&#1086;&#1074;&#1086;&#1076;&#1080;&#1090; &#1077;&#1075;&#1086; &#1076;&#1086; &#1074;&#1086;&#1088;&#1086;&#1090; &#1080; &#1079;&#1072;&#1073;&#1080;&#1074;&#1072;&#1077;&#1090;, &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072; &#1089;&#1085;&#1080;&#1084;&#1072;&#1077;&#1090;&#1089;&#1103; &#1077;&#1089;&#1083;&#1080; &#1084;&#1103;&#1095; &#1082;&#1072;&#1089;&#1072;&#1077;&#1090;&#1089;&#1103; &#1079;&#1077;&#1084;&#1083;&#1080;.  &#1055;&#1086;&#1089;&#1083;&#1077; 10 &#1079;&#1072;&#1073;&#1080;&#1090;&#1099;&#1093; &#1084;&#1103;&#1095;&#1077;&#1081; &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1074;&#1086;&#1089;&#1089;&#1090;&#1072;&#1085;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; 1 &#1080;&#1075;&#1088;&#1086;&#1074;&#1072;&#1103; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072;.</rus>\n           <eng>You are a training footballer and your task is to kick as many as possible balls into the goal. You have to keep the ball in the air with your foots and head.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"spiders\"  title=\"SPIDERS\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1077;&#1084;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1086;&#1089;&#1080;&#1090;&#1100; &#1074; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082; &#1074;&#1077;&#1090;&#1086;&#1095;&#1082;&#1080; &#1080;&#1079; &#1083;&#1077;&#1078;&#1072;&#1097;&#1077;&#1081; &#1085;&#1077;&#1074;&#1076;&#1072;&#1083;&#1077;&#1082;&#1077; &#1082;&#1091;&#1095;&#1080; &#1080; &#1085;&#1077; &#1089;&#1090;&#1072;&#1090;&#1100; &#1076;&#1086;&#1073;&#1099;&#1095;&#1077;&#1081; &#1087;&#1072;&#1091;&#1082;&#1086;&#1074;, &#1089;&#1087;&#1091;&#1089;&#1082;&#1072;&#1102;&#1097;&#1080;&#1093;&#1089;&#1103; &#1089;&#1074;&#1077;&#1088;&#1093;&#1091; &#1085;&#1072; &#1087;&#1072;&#1091;&#1090;&#1080;&#1085;&#1077;.</rus>\n           <eng>You are an ant bringing twigs into own anthill.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1077;&#1084;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1086;&#1089;&#1080;&#1090;&#1100; &#1074; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082; &#1074;&#1077;&#1090;&#1086;&#1095;&#1082;&#1080; &#1080;&#1079; &#1083;&#1077;&#1078;&#1072;&#1097;&#1077;&#1081; &#1085;&#1077;&#1074;&#1076;&#1072;&#1083;&#1077;&#1082;&#1077; &#1082;&#1091;&#1095;&#1080; &#1080; &#1085;&#1077; &#1089;&#1090;&#1072;&#1090;&#1100; &#1076;&#1086;&#1073;&#1099;&#1095;&#1077;&#1081; &#1087;&#1072;&#1091;&#1082;&#1086;&#1074;, &#1089;&#1087;&#1091;&#1089;&#1082;&#1072;&#1102;&#1097;&#1080;&#1093;&#1089;&#1103; &#1089;&#1074;&#1077;&#1088;&#1093;&#1091; &#1085;&#1072; &#1087;&#1072;&#1091;&#1090;&#1080;&#1085;&#1077;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1087;&#1077;&#1088;&#1077;&#1084;&#1077;&#1097;&#1072;&#1090;&#1100; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1103; &#1074;&#1083;&#1077;&#1074;&#1086;/&#1074;&#1087;&#1088;&#1072;&#1074;&#1086;. &#1055;&#1086;&#1076;&#1073;&#1077;&#1078;&#1072;&#1074; &#1082; &#1082;&#1091;&#1095;&#1077; &#1074;&#1077;&#1090;&#1086;&#1095;&#1077;&#1082;, &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081; &#1074;&#1079;&#1074;&#1072;&#1083;&#1080;&#1074;&#1072;&#1077;&#1090; &#1086;&#1076;&#1085;&#1091; &#1089;&#1077;&#1073;&#1077; &#1085;&#1072; &#1089;&#1087;&#1080;&#1085;&#1091;. &#1042;&#1077;&#1088;&#1085;&#1091;&#1074;&#1096;&#1080;&#1089;&#1100; &#1082; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082;&#1091;, &#1086;&#1085; &#1073;&#1088;&#1086;&#1089;&#1072;&#1077;&#1090; &#1089;&#1074;&#1086;&#1081; &#1075;&#1088;&#1091;&#1079; &#1074; &#1087;&#1088;&#1086;&#1077;&#1084; &#1080; &#1073;&#1077;&#1078;&#1080;&#1090; &#1079;&#1072; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1084;. &#1047;&#1072; &#1082;&#1072;&#1078;&#1076;&#1091;&#1102; &#1076;&#1086;&#1089;&#1090;&#1072;&#1074;&#1083;&#1077;&#1085;&#1085;&#1091;&#1102; &#1074;&#1077;&#1090;&#1086;&#1095;&#1082;&#1091; &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1085;&#1072;&#1095;&#1080;&#1089;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1086;&#1095;&#1082;&#1080;. &#1052;&#1077;&#1078;&#1076;&#1091; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082;&#1086;&#1084; &#1080; &#1082;&#1091;&#1095;&#1077;&#1081; &#1074;&#1077;&#1090;&#1086;&#1082; &#1074;&#1080;&#1089;&#1103;&#1090; &#1085;&#1072; &#1089;&#1074;&#1086;&#1080;&#1093; &#1087;&#1072;&#1091;&#1090;&#1080;&#1085;&#1072;&#1093; &#1087;&#1072;&#1091;&#1082;&#1080;, &#1087;&#1086;&#1076;&#1078;&#1080;&#1076;&#1072;&#1102;&#1097;&#1080;&#1077; &#1076;&#1086;&#1073;&#1099;&#1095;&#1091;. &#1055;&#1072;&#1091;&#1082;&#1080; &#1073;&#1099;&#1089;&#1090;&#1088;&#1086; &#1086;&#1087;&#1091;&#1089;&#1082;&#1072;&#1102;&#1090;&#1089;&#1103; &#1080; &#1084;&#1077;&#1076;&#1083;&#1077;&#1085;&#1085;&#1086; &#1087;&#1086;&#1076;&#1085;&#1080;&#1084;&#1072;&#1102;&#1090;&#1089;&#1103; &#1087;&#1086; &#1087;&#1072;&#1091;&#1090;&#1080;&#1085;&#1077;. &#1050;&#1088;&#1086;&#1084;&#1077; &#1090;&#1086;&#1075;&#1086;, &#1086;&#1085;&#1080; &#1087;&#1077;&#1088;&#1077;&#1076;&#1074;&#1080;&#1075;&#1072;&#1102;&#1090;&#1089;&#1103; &#1089; &#1086;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1082;&#1072;&#1084;&#1080;, &#1080;&#1085;&#1086;&#1075;&#1076;&#1072; &#1084;&#1077;&#1085;&#1103;&#1103; &#1087;&#1086;&#1089;&#1083;&#1077; &#1090;&#1072;&#1082;&#1086;&#1081; &#1087;&#1072;&#1091;&#1079;&#1099; &#1085;&#1072;&#1087;&#1088;&#1072;&#1074;&#1083;&#1077;&#1085;&#1080;&#1077; &#1076;&#1074;&#1080;&#1078;&#1077;&#1085;&#1080;&#1103;. &#1045;&#1089;&#1083;&#1080; &#1087;&#1072;&#1091;&#1082; &#1089;&#1093;&#1074;&#1072;&#1090;&#1080;&#1090; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1103;, &#1090;&#1086; &#1080;&#1075;&#1088;&#1086;&#1082; &#1090;&#1077;&#1088;&#1103;&#1077;&#1090; &#1086;&#1076;&#1085;&#1091; &#1080;&#1075;&#1088;&#1086;&#1074;&#1091;&#1102; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1091;.</rus>\n           <eng>You are an ant bringing twigs into own anthill. You should bring as many twigs as possible and to avoid clutches of spiders.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"tastydish\"  title=\"TASTY DISH\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083;&#1086;&#1084;, &#1086;&#1093;&#1086;&#1090;&#1103;&#1097;&#1080;&#1084;&#1089;&#1103; &#1074; &#1088;&#1077;&#1082;&#1077; &#1091; &#1073;&#1077;&#1088;&#1077;&#1075;&#1072;.</rus>\n           <eng>You are a crocodile living in a river.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083;&#1086;&#1084;, &#1086;&#1093;&#1086;&#1090;&#1103;&#1097;&#1080;&#1084;&#1089;&#1103; &#1074; &#1088;&#1077;&#1082;&#1077; &#1091; &#1073;&#1077;&#1088;&#1077;&#1075;&#1072;. &#1050;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1087;&#1086;&#1081;&#1084;&#1072;&#1090;&#1100; &#1089;&#1074;&#1086;&#1102; &#1076;&#1086;&#1073;&#1099;&#1095;&#1091; &#1080; &#1085;&#1077; &#1087;&#1086;&#1087;&#1072;&#1089;&#1090;&#1100; &#1085;&#1072; &#1084;&#1091;&#1096;&#1082;&#1091; &#1086;&#1093;&#1086;&#1090;&#1085;&#1080;&#1082;&#1072;. &#1050;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083; &#1076;&#1074;&#1080;&#1078;&#1077;&#1090;&#1089;&#1103; &#1082; &#1073;&#1077;&#1088;&#1077;&#1075;&#1091;, &#1087;&#1077;&#1088;&#1077;&#1089;&#1077;&#1082;&#1072;&#1103; &#1088;&#1077;&#1082;&#1091;, &#1089; &#1087;&#1086;&#1089;&#1090;&#1086;&#1103;&#1085;&#1085;&#1086;&#1081; &#1089;&#1082;&#1086;&#1088;&#1086;&#1089;&#1090;&#1100;&#1102;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1087;&#1086;&#1074;&#1086;&#1088;&#1072;&#1095;&#1080;&#1074;&#1072;&#1090;&#1100; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083;&#1072; &#1074;&#1083;&#1077;&#1074;&#1086;/&#1074;&#1087;&#1088;&#1072;&#1074;&#1086;, &#1074;&#1099;&#1073;&#1080;&#1088;&#1072;&#1103; &#1085;&#1072; &#1082;&#1072;&#1082;&#1086;&#1081; &#1091;&#1095;&#1072;&#1089;&#1090;&#1086;&#1082; &#1073;&#1077;&#1088;&#1077;&#1075;&#1072; &#1085;&#1072;&#1087;&#1072;&#1089;&#1090;&#1100;. &#1055;&#1086;&#1076;&#1087;&#1083;&#1099;&#1074; &#1082; &#1073;&#1077;&#1088;&#1077;&#1075;&#1091;, &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083; &#1093;&#1074;&#1072;&#1090;&#1072;&#1077;&#1090; &#1076;&#1086;&#1073;&#1099;&#1095;&#1091;, &#1077;&#1089;&#1083;&#1080; &#1085;&#1072; &#1101;&#1090;&#1086;&#1084; &#1091;&#1095;&#1072;&#1089;&#1090;&#1082;&#1077; &#1077;&#1089;&#1090;&#1100; &#1082;&#1072;&#1082;&#1086;&#1077;-&#1083;&#1080;&#1073;&#1086; &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1086;&#1077;, &#1087;&#1100;&#1102;&#1097;&#1077;&#1077; &#1074;&#1086;&#1076;&#1091; &#1080;&#1079; &#1088;&#1077;&#1082;&#1080;. &#1048;&#1075;&#1088;&#1086;&#1082;&#1091; &#1085;&#1072;&#1095;&#1080;&#1089;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1086;&#1095;&#1082;&#1080;, &#1074; &#1079;&#1072;&#1074;&#1080;&#1089;&#1080;&#1084;&#1086;&#1089;&#1090;&#1080; &#1086;&#1090; &#1094;&#1077;&#1085;&#1085;&#1086;&#1089;&#1090;&#1080; &#1076;&#1086;&#1073;&#1099;&#1095;&#1080;. &#1053;&#1072; &#1084;&#1077;&#1089;&#1090;&#1077; &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1086;&#1075;&#1086; &#1084;&#1086;&#1078;&#1077;&#1090; &#1086;&#1082;&#1072;&#1079;&#1072;&#1090;&#1100;&#1089;&#1103; &#1086;&#1093;&#1086;&#1090;&#1085;&#1080;&#1082;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081;, &#1087;&#1086;&#1103;&#1074;&#1080;&#1074;&#1096;&#1080;&#1089;&#1100; &#1085;&#1072; &#1073;&#1077;&#1088;&#1077;&#1075;&#1091;, &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1077;&#1090; &#1074; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083;&#1072;, &#1077;&#1089;&#1083;&#1080; &#1090;&#1086;&#1090; &#1085;&#1072;&#1093;&#1086;&#1076;&#1080;&#1090;&#1089;&#1103; &#1085;&#1072;&#1087;&#1088;&#1086;&#1090;&#1080;&#1074; &#1085;&#1077;&#1075;&#1086;. &#1042; &#1101;&#1090;&#1086;&#1084; &#1089;&#1083;&#1091;&#1095;&#1072;&#1077; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083; &#1087;&#1086;&#1075;&#1080;&#1073;&#1072;&#1077;&#1090;, &#1072; &#1080;&#1075;&#1088;&#1086;&#1082; &#1090;&#1077;&#1088;&#1103;&#1077;&#1090; &#1080;&#1075;&#1088;&#1086;&#1074;&#1091;&#1102; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1091;. &#1045;&#1089;&#1083;&#1080; &#1085;&#1072; &#1091;&#1095;&#1072;&#1089;&#1090;&#1082;&#1077; &#1073;&#1077;&#1088;&#1077;&#1075;&#1072;, &#1082; &#1082;&#1086;&#1090;&#1086;&#1088;&#1086;&#1084;&#1091; &#1073;&#1099;&#1083; &#1085;&#1072;&#1087;&#1088;&#1072;&#1074;&#1083;&#1077;&#1085; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083;, &#1085;&#1077;&#1090; &#1076;&#1086;&#1073;&#1099;&#1095;&#1080;, &#1090;&#1086; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083; &#1086;&#1089;&#1090;&#1072;&#1077;&#1090;&#1089;&#1103; &#1085;&#1080; &#1089; &#1095;&#1077;&#1084; &#1080; &#1087;&#1086;&#1075;&#1088;&#1091;&#1078;&#1072;&#1077;&#1090;&#1089;&#1103; &#1086;&#1073;&#1088;&#1072;&#1090;&#1085;&#1086; &#1074; &#1074;&#1086;&#1076;&#1091;. &#1044;&#1083;&#1103; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1077;&#1081; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1080; &#1087;&#1088;&#1080;&#1076;&#1077;&#1090;&#1089;&#1103; &#1089;&#1085;&#1086;&#1074;&#1072; &#1087;&#1077;&#1088;&#1077;&#1087;&#1083;&#1099;&#1074;&#1072;&#1090;&#1100; &#1088;&#1077;&#1082;&#1091;, &#1087;&#1086;&#1076;&#1082;&#1088;&#1072;&#1076;&#1099;&#1074;&#1072;&#1103;&#1089;&#1100; &#1080;&#1079;&#1076;&#1072;&#1083;&#1077;&#1082;&#1072;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1087;&#1088;&#1086;&#1084;&#1072;&#1093;&#1085;&#1091;&#1090;&#1100;&#1089;&#1103; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; 20 &#1088;&#1072;&#1079;, &#1087;&#1086;&#1089;&#1083;&#1077; &#1095;&#1077;&#1075;&#1086; &#1086;&#1085; &#1090;&#1077;&#1088;&#1103;&#1077;&#1090; &#1080;&#1075;&#1088;&#1086;&#1074;&#1091;&#1102; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1091;.</rus>\n           <eng>You are a crocodile living in a river. Your task is to catch as many animals on the beach as possible. Time to time the hunter visits the beach and attempts to kill you with a gun.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"waterway\"  title=\"WATER WAY\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1042;&#1099; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090;&#1077; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1077;&#1084;, &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1102;&#1097;&#1080;&#1084; &#1074;&#1086;&#1076;&#1091; &#1076;&#1083;&#1103; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082;&#1086;&#1074;.</rus>\n           <eng>You are an ant collecting dew for its ant heap.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090;&#1077; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1077;&#1084;, &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1102;&#1097;&#1080;&#1084; &#1074;&#1086;&#1076;&#1091; &#1076;&#1083;&#1103; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082;&#1086;&#1074;. &#1042;&#1072;&#1096;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1083;&#1086;&#1074;&#1080;&#1090;&#1100; &#1087;&#1086; &#1086;&#1076;&#1085;&#1086;&#1081; &#1082;&#1072;&#1087;&#1083;&#1077; &#1074;&#1086;&#1076;&#1099; &#1074; &#1083;&#1080;&#1089;&#1090;&#1086;&#1082; &#1080; &#1074;&#1099;&#1083;&#1080;&#1074;&#1072;&#1090;&#1100; &#1077;&#1077; &#1074; &#1094;&#1074;&#1077;&#1090;&#1086;&#1082; &#1074;&#1072;&#1096;&#1077;&#1075;&#1086; &#1085;&#1072;&#1087;&#1072;&#1088;&#1085;&#1080;&#1082;&#1072;-&#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1103;. &#1051;&#1080;&#1089;&#1090;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1074;&#1099;&#1076;&#1077;&#1088;&#1078;&#1072;&#1090;&#1100; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1086;&#1076;&#1085;&#1091; &#1082;&#1072;&#1087;&#1083;&#1102;!</rus>\n           <eng>You are an ant collecting dew for its ant heap. Your task is to catch drops with a leaf and pour out it in the flower of your workmate. Remember, the leaf can contain one drop only.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"wildballs\"  title=\"WILD BALLS\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    <sport/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082;  &#1086;&#1089;&#1091;&#1097;&#1077;&#1089;&#1090;&#1074;&#1083;&#1103;&#1077;&#1090; &#1080;&#1075;&#1088;&#1091; &#1074; &#1092;&#1091;&#1090;&#1091;&#1088;&#1080;&#1089;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080;&#1077; &#1082;&#1077;&#1075;&#1083;&#1080; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1074;&#1099;&#1073;&#1080;&#1090;&#1100; &#1082;&#1072;&#1082;  &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1077;&#1075;&#1083;&#1077;&#1081;, &#1079;&#1072;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1103; &#1086;&#1095;&#1082;&#1080; &#1087;&#1088;&#1080; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1085;&#1086;&#1084; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1077; &#1096;&#1072;&#1088;&#1086;&#1074;.</rus>\n           <eng>You should clear as many as possible pins with own balls.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082;  &#1086;&#1089;&#1091;&#1097;&#1077;&#1089;&#1090;&#1074;&#1083;&#1103;&#1077;&#1090; &#1080;&#1075;&#1088;&#1091; &#1074; &#1092;&#1091;&#1090;&#1091;&#1088;&#1080;&#1089;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080;&#1077; &#1082;&#1077;&#1075;&#1083;&#1080; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1074;&#1099;&#1073;&#1080;&#1090;&#1100; &#1082;&#1072;&#1082;  &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1077;&#1075;&#1083;&#1077;&#1081;, &#1079;&#1072;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1103; &#1086;&#1095;&#1082;&#1080; &#1087;&#1088;&#1080; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1085;&#1086;&#1084; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1077; &#1096;&#1072;&#1088;&#1086;&#1074;. &#1053;&#1086; &#1082;&#1077;&#1075;&#1083;&#1080; &#1085;&#1077;&#1083;&#1100;&#1079;&#1103; &#1089;&#1073;&#1080;&#1074;&#1072;&#1090;&#1100; &#1085;&#1072;&#1087;&#1088;&#1103;&#1084;&#1091;&#1102; &#1089;&#1074;&#1086;&#1080;&#1084; &#1096;&#1072;&#1088;&#1086;&#1084;, &#1087;&#1086;&#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1077;&#1088;&#1080;&#1086;&#1076;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1089;&#1083;&#1091;&#1095;&#1072;&#1081;&#1085;&#1099;&#1084; &#1086;&#1073;&#1088;&#1072;&#1079;&#1086;&#1084;, &#1101;&#1082;&#1088;&#1072;&#1085; &#1087;&#1077;&#1088;&#1077;&#1089;&#1077;&#1082;&#1072;&#1102;&#1090; &#1096;&#1072;&#1088;&#1099;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1080;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1072;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100; &#1085;&#1072; &#1082;&#1077;&#1075;&#1083;&#1080;, &#1087;&#1086;&#1089;&#1088;&#1077;&#1076;&#1089;&#1090;&#1074;&#1086;&#1084; &#1091;&#1076;&#1072;&#1088;&#1072; &#1089;&#1074;&#1086;&#1080;&#1084; &#1096;&#1072;&#1088;&#1086;&#1084; &#1080; &#1080;&#1079;&#1084;&#1077;&#1085;&#1077;&#1085;&#1080;&#1103; &#1090;&#1088;&#1072;&#1077;&#1082;&#1090;&#1086;&#1088;&#1080;&#1080; &#1082;&#1072;&#1090;&#1103;&#1097;&#1077;&#1075;&#1086;&#1089;&#1103; &#1096;&#1072;&#1088;&#1072;. &#1045;&#1089;&#1083;&#1080; &#1080;&#1075;&#1088;&#1086;&#1082; &#1087;&#1088;&#1086;&#1084;&#1072;&#1093;&#1085;&#1077;&#1090;&#1089;&#1103; &#1084;&#1080;&#1084;&#1086; &#1082;&#1072;&#1090;&#1103;&#1097;&#1077;&#1075;&#1086;&#1089;&#1103; &#1096;&#1072;&#1088;&#1072;, &#1090;&#1086; &#1077;&#1075;&#1086; &#1096;&#1072;&#1088; &#1088;&#1072;&#1079;&#1086;&#1073;&#1100;&#1077;&#1090;&#1089;&#1103; &#1086; &#1087;&#1086;&#1076;&#1085;&#1103;&#1074;&#1096;&#1091;&#1102;&#1089;&#1103; &#1089;&#1090;&#1077;&#1085;&#1082;&#1091; &#1080; &#1086;&#1076;&#1085;&#1072; &#1080;&#1075;&#1088;&#1086;&#1074;&#1072;&#1103; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072; &#1073;&#1091;&#1076;&#1077;&#1090; &#1089;&#1085;&#1103;&#1090;&#1072;.</rus>\n           <eng>You should clear as many as possible pins with own balls. You must use a rolling ball to clear pins; you have to direct the ball at a pin with your ball. If you miss, your ball will be lost.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"mtvpuzzle\"  title=\"MTV PUZZLE\" year=\"2005\">\n        <all/>\n\t\t<logic/>\n\t    \n\t    <owner id=\"mtv\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1072;&#1103; &#1080;&#1075;&#1088;&#1072; 15 &#1085;&#1072; &#1090;&#1077;&#1084;&#1091; MTV.</rus>\n           <eng>A puzzle game.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1072;&#1096;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072;-&#1087;&#1077;&#1088;&#1077;&#1076;&#1074;&#1080;&#1075;&#1072;&#1103; &#1082;&#1074;&#1072;&#1076;&#1088;&#1072;&#1090;&#1080;&#1082;&#1080;,&#1089;&#1086;&#1073;&#1088;&#1072;&#1090;&#1100; &#1080;&#1079;&#1085;&#1072;&#1095;&#1072;&#1083;&#1100;&#1085;&#1091;&#1102; &#1082;&#1072;&#1088;&#1090;&#1080;&#1085;&#1082;&#1091; &#1079;&#1072; &#1084;&#1080;&#1085;&#1080;&#1084;&#1072;&#1083;&#1100;&#1085;&#1086;&#1077; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1086; &#1093;&#1086;&#1076;&#1086;&#1074;. &#1048;&#1084;&#1077;&#1077;&#1090;&#1089;&#1103; &#1090;&#1088;&#1080; &#1091;&#1088;&#1086;&#1074;&#1085;&#1103; &#1089;&#1083;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1080; &#1087;&#1086;&#1083;&#1103;: 3&#1093;3,4&#1093;4 &#1080; 5&#1093;5.</rus>\n           <eng>Your task is to collect a full image with moved squares.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n        </devices>\n\t</game>\n\n     <game id=\"mtvpaparazzo\"  title=\"PAPARAZZO\" year=\"2005\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"mtv\"/>\n\n        <shortreference>\n           <rus>&#1053;&#1072;&#1097;&#1077;&#1083;&#1082;&#1072;&#1081; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1079;&#1074;&#1077;&#1079;&#1076; &#1085;&#1072; &#1089;&#1074;&#1086;&#1081; &#1092;&#1086;&#1090;&#1080;&#1082;...</rus>\n           <eng>You are a paparazzo and your task to get as many photos of celebrities as possible.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1076;&#1086;&#1083;&#1078;&#1085;&#1099; &#1092;&#1086;&#1090;&#1086;&#1075;&#1088;&#1072;&#1092;&#1080;&#1088;&#1086;&#1074;&#1072;&#1090;&#1100; &#1083;&#1080;&#1094;&#1072; &#1079;&#1085;&#1072;&#1084;&#1077;&#1085;&#1080;&#1090;&#1086;&#1089;&#1090;&#1077;&#1081; &#1096;&#1086;&#1091;-&#1073;&#1080;&#1079;&#1085;&#1077;&#1089;&#1072;,&#1080;&#1084;&#1077;&#1102;&#1097;&#1080;&#1093; &#1079;&#1085;&#1072;&#1082; '&#1079;&#1074;&#1077;&#1079;&#1076;&#1099;' &#1080; &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1090;&#1100; &#1086;&#1093;&#1088;&#1072;&#1085;&#1085;&#1080;&#1082;&#1086;&#1074; &#1074; &#1086;&#1082;&#1085;&#1072;&#1093;. &#1042;&#1072;&#1096;&#1077; &#1074;&#1088;&#1077;&#1084;&#1103; &#1080; &#1095;&#1080;&#1089;&#1083;&#1086; &#1082;&#1072;&#1076;&#1088;&#1086;&#1074;-&#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1099;.</rus>\n           <eng>You are a paparazzo and your task to get as many photos of celebrities as possible.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n        </devices>\n\t</game>\n\n     <game id=\"mtvpillow\"  title=\"PILLOW\" year=\"2005\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"mtv\"/>\n\n        <shortreference>\n           <rus>&#1053;&#1077; &#1083;&#1102;&#1073;&#1080;&#1096;&#1100; &#1074;&#1080;&#1076;&#1078;&#1077;&#1077;&#1074;? &#1053;&#1091; &#1090;&#1086;&#1075;&#1076;&#1072; &#1087;&#1086;&#1076;&#1091;&#1096;&#1082;&#1091; &#1074; &#1088;&#1091;&#1082;&#1080; &#1080; &#1087;&#1086;&#1096;&#1083;&#1080; &#1086;&#1090;&#1088;&#1099;&#1074;&#1072;&#1090;&#1100;&#1089;&#1103; &#1074; &#1086;&#1092;&#1080;&#1089;&#1077; &#1052;&#1058;&#1042;...</rus>\n           <eng>You're a visitor of MTV office and your task is to belabour music stars by a pillow.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1058;&#1099; &#1093;&#1086;&#1076;&#1080;&#1096;&#1100; &#1087;&#1086; &#1086;&#1092;&#1080;&#1089;&#1091; MTV &#1080; &#1076;&#1091;&#1073;&#1072;&#1089;&#1080;&#1096;&#1100; &#1074;&#1089;&#1077;&#1093; &#1087;&#1086;&#1076;&#1091;&#1096;&#1082;&#1086;&#1081;.&#1054;&#1087;&#1072;&#1089;&#1072;&#1081;&#1089;&#1103; &#1086;&#1093;&#1088;&#1072;&#1085;&#1085;&#1080;&#1082;&#1086;&#1074; &#1089; &#1076;&#1091;&#1073;&#1080;&#1085;&#1082;&#1072;&#1084;&#1080;.&#1047;&#1072;&#1093;&#1086;&#1076;&#1080; &#1074; &#1076;&#1074;&#1077;&#1088;&#1080;,&#1090;&#1072;&#1084; &#1084;&#1086;&#1075;&#1091;&#1090; &#1073;&#1099;&#1090;&#1100; &#1087;&#1086;&#1076;&#1091;&#1096;&#1082;&#1080;.&#1051;&#1086;&#1074;&#1080; &#1089;&#1077;&#1088;&#1076;&#1094;&#1072;-&#1101;&#1090;&#1086; &#1078;&#1080;&#1079;&#1085;&#1080;.</rus>\n           <eng>You're a visitor of MTV office and your task is to belabour music stars by a pillow.You can find new pillows in rooms.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n        </devices>\n\t</game>\n\n     <game id=\"mtvstage\"  title=\"HOLD OUT ON THE STAGE\" year=\"2005\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"mtv\"/>\n\n        <shortreference>\n           <rus>&#1055;&#1077;&#1090;&#1100; &#1084;&#1099; &#1074;&#1089;&#1077; &#1083;&#1102;&#1073;&#1080;&#1084;, &#1085;&#1086; &#1085;&#1077; &#1091; &#1074;&#1089;&#1077;&#1093; &#1077;&#1089;&#1090;&#1100; &#1089;&#1083;&#1091;&#1093;. &#1043;&#1083;&#1072;&#1074;&#1085;&#1086;&#1077; - &#1091;&#1074;&#1086;&#1088;&#1072;&#1095;&#1080;&#1074;&#1072;&#1090;&#1100;&#1089;&#1103; &#1086;&#1090; &#1090;&#1103;&#1078;&#1077;&#1083;&#1099;&#1093; &#1087;&#1088;&#1077;&#1076;&#1084;&#1077;&#1090;&#1086;&#1074;...</rus>\n           <eng>You are a rock-star and your worshipper throw different things on your stage.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1076;&#1086;&#1083;&#1078;&#1085;&#1099; &#1087;&#1088;&#1086;&#1076;&#1077;&#1088;&#1078;&#1072;&#1090;&#1100;&#1089;&#1103; &#1085;&#1072; &#1089;&#1094;&#1077;&#1085;&#1077; &#1086;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1077;&#1085;&#1085;&#1086;&#1077; &#1074;&#1088;&#1077;&#1084;&#1103;,&#1091;&#1074;&#1086;&#1088;&#1072;&#1095;&#1080;&#1074;&#1072;&#1103;&#1089;&#1100; &#1086;&#1090; &#1075;&#1088;&#1072;&#1076;&#1072; &#1086;&#1087;&#1072;&#1089;&#1085;&#1099;&#1093; &#1087;&#1088;&#1077;&#1076;&#1084;&#1077;&#1090;&#1086;&#1074;,&#1083;&#1077;&#1090;&#1103;&#1097;&#1080;&#1093; &#1080;&#1079; &#1079;&#1072;&#1083;&#1072;.&#1051;&#1086;&#1074;&#1080;&#1090;&#1077; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1094;&#1074;&#1077;&#1090;&#1099; &#1074;&#1072;&#1096;&#1080;&#1093; &#1092;&#1072;&#1085;&#1072;&#1090;&#1086;&#1074; &#1080; &#1079;&#1072;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1081;&#1090;&#1077; &#1101;&#1090;&#1080;&#1084; &#1086;&#1095;&#1082;&#1080;.</rus>\n           <eng>You are a rock-star and your worshipper throw different things on your stage.You have to avoid collision with bad things and catch flowers.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n        </devices>\n\t</game>\n\n\t</games>\n</data>"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/hotnews.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>NEWS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n</head>\n<body>\n//#+\n//#local l_cnewsNewsFile = xml_root(xml_open(\"hotnews.xml\"))\n//#local l_cnewsNewsList = xml_list(l_cnewsNewsFile,\"news\") \n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n//#local l_cnewsIndex = 0\n//#while l_cnewsIndex<xml_size(l_cnewsNewsList)\n//#local l_cnewsCurNews = xml_get(l_cnewsNewsList,l_cnewsIndex)\n//#local l_cnewsCurNews = xml_get(xml_list(l_cnewsCurNews,curLangID),0)\n//#local l_cnewsName = xml_text(xml_get(xml_list(l_cnewsCurNews,\"name\"),0))\n//#local l_cnewsContent = xml_text(xml_get(xml_list(l_cnewsCurNews,\"content\"),0))\n//#local l_cnewsRef = xml_text(xml_get(xml_list(l_cnewsCurNews,\"href\"),0))\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">/*$l_cnewsName$*/</span><br>\n</div>\n<div align=\"justify\">/*$l_cnewsContent$*/<br>\n//#if curLangID==\"rus\"\n<span class=\"rightnewsHdr\"><a href=\"/*$l_cnewsRef$*/\" target=\"_new\"> ...</a></div></td>\n//#else\n<span class=\"rightnewsHdr\"><a href=\"/*$l_cnewsRef$*/\" target=\"_new\">read more...</a></div></td>\n//#endif\n</tr>\n//#local l_cnewsIndex = l_cnewsIndex + 1 \n//#end\n</table>\n//#-\n</body>\n</html>\n//#+"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/hotnews.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hotnews>\n\t<news>\n  \t\t<rus>\n  \t\t   <name>Papanin's quest</name>\n  \t\t   <content>&#1059;&#1074;&#1083;&#1077;&#1082;&#1072;&#1090;&#1077;&#1083;&#1100;&#1085;&#1072;&#1103; &#1080;&#1075;&#1088;&#1072; \"Papanin's quest\" &#1076;&#1083;&#1103; Nokia Series 60, &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1085;&#1072; &#1085;&#1072; Playmobile.</content>\n  \t\t   <href>http://www.playmobile.ru/games/arcade/Papanins_Quest</href>\n  \t\t</rus>\n        <eng>\n  \t\t   <name>Papanin's quest</name>\n  \t\t   <content>The Papanin's quest game for Nokia Series 60 has been available on Playmobile.</content>\n           <href>http://www.playmobile.ru/games/arcade/Papanins_Quest</href>\n  \t\t</eng>\n\t</news>\n    <news>\n  \t\t<rus>\n  \t\t   <name>Mobile chase</name>\n  \t\t   <content>&#1059;&#1074;&#1083;&#1077;&#1082;&#1072;&#1090;&#1077;&#1083;&#1100;&#1085;&#1077;&#1081;&#1096;&#1072;&#1103; &#1075;&#1086;&#1085;&#1082;&#1072; &#1089; &#1101;&#1083;&#1077;&#1084;&#1077;&#1085;&#1090;&#1072;&#1084;&#1080; &#1096;&#1091;&#1090;&#1077;&#1088;&#1072; \"Mobile Chase\" &#1076;&#1083;&#1103; Nokia Series 60, &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1085;&#1072; &#1085;&#1072; Playmobile.</content>\n  \t\t   <href>http://www.playmobile.ru/games/race/Mobile_Chase</href>\n  \t\t</rus>\n        <eng>\n  \t\t   <name>Mobile chase</name>\n  \t\t   <content>Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.</content>\n           <href>http://www.playmobile.ru/games/race/Mobile_Chase</href>\n  \t\t</eng>\n\t</news>\n    <news>\n  \t\t<rus>\n  \t\t   <name>Air aggression</name>\n  \t\t   <content>&#1040;&#1088;&#1082;&#1072;&#1076;&#1072; \"Air aggression\" &#1076;&#1083;&#1103; Nokia Series 60, &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1085;&#1072; &#1085;&#1072; Playmobile.</content>\n  \t\t   <href>http://www.playmobile.ru/games/shooter/Air_Aggression</href>\n  \t\t</rus>\n        <eng>\n  \t\t   <name>Air aggression</name>\n  \t\t   <content>The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.</content>\n           <href>http://www.playmobile.ru/games/shooter/Air_Aggression</href>\n  \t\t</eng>\n\t</news>\n    <news>\n  \t\t<rus>\n  \t\t   <name>Caspian monster</name>\n  \t\t   <content>&#1054;&#1095;&#1077;&#1085;&#1100; &#1082;&#1088;&#1072;&#1089;&#1086;&#1095;&#1085;&#1099;&#1081; &#1089;&#1082;&#1088;&#1086;&#1083;&#1083;&#1096;&#1091;&#1090;&#1077;&#1088; \"Caspian monster\" &#1076;&#1083;&#1103; Nokia Series 60, &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1077;&#1085; &#1085;&#1072; Playmobile.</content>\n  \t\t   <href>http://www.playmobile.ru/games/shooter/Caspian_monster</href>\n  \t\t</rus>\n        <eng>\n  \t\t   <name>Caspian monster</name>\n  \t\t   <content>The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.</content>\n           <href>http://www.playmobile.ru/games/shooter/Caspian_monster</href>\n  \t\t</eng>\n\t</news>\n    <news>\n  \t\t<rus>\n  \t\t   <name>Kalah</name>\n  \t\t   <content>&#1042;&#1086;&#1089;&#1090;&#1086;&#1095;&#1085;&#1072;&#1103; &#1080;&#1075;&#1088;&#1072; &#1050;&#1072;&#1083;&#1072;&#1093;, &#1090;&#1077;&#1087;&#1077;&#1088;&#1100; &#1080;&#1084;&#1077;&#1077;&#1090; &#1089;&#1074;&#1086;&#1102; &#1091;&#1085;&#1080;&#1082;&#1072;&#1083;&#1100;&#1085;&#1091;&#1102; &#1080;&#1085;&#1090;&#1077;&#1088;&#1087;&#1088;&#1077;&#1090;&#1072;&#1094;&#1080;&#1102; &#1085;&#1072; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1099;&#1093; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1072;&#1093; Nokia Series 60 &#1080; &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1085;&#1072; &#1085;&#1072; Playmobile.</content>\n  \t\t   <href>http://www.playmobile.ru/games/logic/Kalah</href>\n  \t\t</rus>\n        <eng>\n  \t\t   <name>Kalah</name>\n  \t\t   <content>The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile</content>\n           <href>http://www.playmobile.ru/games/logic/Kalah</href>\n  \t\t</eng>\n\t</news>\n</hotnews>"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/index.htm",
    "content": "<html>\n<head>\n<script language=\"JavaScript\"> \n<!-- \nwindow.location.href = \"./rus/menu1_news.htm\"\n// --> \n</script>\n\n<title>ColdCore official site</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\"></head>\n\n<body bgcolor=\"#FFFFFF\">\n<table width=\"100%%\" height=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n  <tr>\n    <td align=\"center\" valign=\"middle\"> \n      <table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n        <tr>\n    <td><div align=\"center\"><a href=\"./rus/menu1_news.htm\"><img src=\"cc.gif\" width=\"55\" height=\"42\" border=\"0\"></a></div></td>\n  </tr>\n  <tr>\n    <td><div align=\"center\"><strong><font color=\"#0099CC\">Cold Core</font></strong></div></td>\n  </tr>\n</table>\t\n\t</td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/job.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body>\n//#+\n<p align=\"center\"><strong><em><font size=\"4\">Sorry, but the page is still under \n  construction....</font></em></strong></p>\n<p align=\"center\"><img src=\"../undercon.gif\" width=\"40\" height=\"38\"></p>\n<p align=\"center\"><strong><font size=\"4\"><em>Visit us later, please...</em></font></strong></p>\n\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/loadpages/muzon_AirBoil.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n<HTML><HEAD><TITLE>Java-: Air Boil</TITLE>\n<META http-equiv=Content-Type content=\"text/html; charset=windows-1251\"><LINK \nhref=\"Java- Star Harbor_files/style.css\" type=text/css rel=stylesheet>\n<META content=\"MSHTML 6.00.2800.1505\" name=GENERATOR></HEAD>\n<BODY>\n<TABLE height=\"100%\" cellSpacing=10 cellPadding=0 width=\"100%\" align=center \nborder=0 valign=\"top\">\n  <TBODY>\n  <TR>\n    <TD vAlign=top align=middle width=120><B>Air Boil<BR></B><BR>\n      <HR color=#eeeeee noShade>\n      <IMG src=\"../games/airboil_scr3.gif\"> \n      <HR color=#eeeeee noShade>\n      <FONT color=#ffffff size=+1></FONT><BR><FONT color=red \n      size=+1>5008485</FONT> </TD>\n    <TD vAlign=top align=left><FONT size=+1> ?</FONT> <BR>\n      <P>\n      <P>  SMS-.</P>\n      <P>    <B>5008485</B></P>\n      <P> SMS-       \n:<BR>\n      <TABLE borderColor=#000000 cellSpacing=0 cellPadding=4 border=1 noshade \n      table>\n        <TBODY>\n        <TR>\n          <TD width=151 height=40></TD>\n          <TD>  </TD>\n          <TD> </TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>-</TD>\n          <TD align=middle><FONT color=red size=+1>9998</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>, , , , , , , \n             , , , , , , \n            , , , , , , , \n          </TD>\n          <TD align=middle><FONT color=red size=+1>9998</FONT></TD></TR></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mega_logo.gif\" width=151></TD><!-- -->\n          <TD>-</TD>\n          <TD align=middle><FONT color=red size=+1>9998</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/bee_logo.gif\" width=64></TD><!-- -->\n          <TD>   , , , , , \n            , , , , , , , \n            , , , , , -,  \n             , , , , , , , \n            , -,  , , ,  \n             ,  , ,  , , \n            , , , , , - \n            , ,  </TD>\n          <TD align=middle><FONT color=red \n      size=+1>9998</FONT></TD></TR></TBODY></TABLE></P>\n      <P class=small>  SMS-    \n        $2,50   . </P>\n      <P>     WAP-,<BR>  \n      <BR>(    ).</P>\n      <P> :<BR><B>Motorola: C380, C650, v220, v180, v300, \n      v500, v600, v535, v550, v620, E398, E375, v3<BR>Nokia: 3510i, 7210, \n      3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, \n      6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i, 6230, 5140, 5140, \n      6170, 6255, 6020, 7260, 7270, 3650, 3600, 3620, 3660, 7650, N-Gage, \n      N-GageQD, 7610, 6260, 6670, 3230<BR>Samsung: C100, C108T, C110, S300, \n      S300M, S307, E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, \n      E820, X460, X468, X100, X108, X600, X608<BR>Siemens: M55, C60, MC60, S55, SL55, S65, CX65, \n      CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65, C65, \n      SL65<BR>LG: G1600<BR>Sony Ericsson: T610, T616, T618, T628, T630, T637, \n      Z600, Z608<BR></B><BR></P>\n      <P></P></TD></TR></TBODY></TABLE>\n<HR color=#666666 noShade>\n</BODY></HTML>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/loadpages/muzon_StarHarbor.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n<!-- saved from url=(0056)http://www.muzon.ru/game_preview.jsp?cat=all&type=p&id=1 -->\n<HTML><HEAD><TITLE>Java-: Star Harbor</TITLE>\n<META http-equiv=Content-Type content=\"text/html; charset=windows-1251\"><LINK \nhref=\"Java- Star Harbor_files/style.css\" type=text/css rel=stylesheet>\n<META content=\"MSHTML 6.00.2800.1505\" name=GENERATOR></HEAD>\n<BODY>\n<TABLE height=\"100%\" cellSpacing=10 cellPadding=0 width=\"100%\" align=center \nborder=0 valign=\"top\">\n  <TBODY>\n  <TR>\n    <TD vAlign=top align=middle width=120><B>Star Harbor<BR></B><BR>\n      <HR color=#eeeeee noShade>\n      <IMG src=\"../games/starharbor_scr3.gif\"> \n      <HR color=#eeeeee noShade>\n      <FONT color=#ffffff size=+1></FONT><BR><FONT color=red \n      size=+1>5006971</FONT> </TD>\n    <TD vAlign=top align=left><FONT size=+1> ?</FONT> <BR>\n      <P>\n      <P>  SMS-.</P>\n      <P>    <B>5006971</B></P>\n      <P> SMS-       \n:<BR>\n      <TABLE borderColor=#000000 cellSpacing=0 cellPadding=4 border=1 noshade \n      table>\n        <TBODY>\n        <TR>\n          <TD width=151 height=40></TD>\n          <TD>  </TD>\n          <TD> </TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>-</TD>\n          <TD align=middle><FONT color=red size=+1>4012</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>, , , , , , , \n             , , , , , , \n            , , , , , , , \n          </TD>\n          <TD align=middle><FONT color=red size=+1>4012</FONT></TD></TR></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mega_logo.gif\" width=151></TD><!-- -->\n          <TD>-</TD>\n          <TD align=middle><FONT color=red size=+1>4012</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/bee_logo.gif\" width=64></TD><!-- -->\n          <TD>   , , , , , \n            , , , , , , , \n            , , , , , -,  \n             , , , , , , , \n            , -,  , , ,  \n             ,  , ,  , , \n            , , , , , - \n            , ,  </TD>\n          <TD align=middle><FONT color=red \n      size=+1>4012</FONT></TD></TR></TBODY></TABLE></P>\n      <P class=small>  SMS-    \n        $2,50   . </P>\n      <P>     WAP-,<BR>  \n      <BR>(    ).</P>\n      <P> :<BR><B>Motorola: C380, C650, v220, v180, v300, \n      v500, v600, v535, v550, v620, E398, E375, v3<BR>Nokia: 3410, 3510i, 7210, \n      3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, \n      6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i, 6230, 5140, 5140, \n      6170, 6255, 6020, 7260, 7270, 3650, 3600, 3620, 3660, 7650, N-Gage, \n      N-GageQD, 7610, 6260, 6670, 3230<BR>Samsung: C100, C108T, C110, S300, \n      S300M, S307, E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, \n      E820, X460, X468, X100, X108, X600, X608<BR>Siemens: M(T)50, C55, C56, \n      CT56, 6688i, M46, 3118, SL45i, M55, C60, MC60, S55, SL55, S65, CX65, \n      CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65, C65, \n      SL65<BR>LG: G1600<BR>Sony Ericsson: T610, T616, T618, T628, T630, T637, \n      Z600, Z608<BR></B><BR></P>\n      <P></P></TD></TR></TBODY></TABLE>\n<HR color=#666666 noShade>\n</BODY></HTML>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/main.htm",
    "content": "//#local site_file = xml_root(xml_open(\"site.xml\"))\n//#local games_file = xml_root(xml_open(\"games.xml\"))\n//#local games_list = xml_list(xml_get(xml_list(games_file,\"games\"),0),\"game\")\n\n//#local languages= xml_list(xml_get(xml_list(site_file,\"languages\"),0),\"lang\")\n//#local langsNumber = xml_size(languages)\n\n//#local langIndex = 0\n\n//#while langIndex<langsNumber\n//#local curLangID = xml_attr(xml_get(languages,langIndex),\"id\")\n//#local curLangText = xml_attr(xml_get(languages,langIndex),\"text\")\n\n//#local outFileName = \"index.htm\"\n\n//#echo Language /*$curLangText$*/\n//#outdir curLangID\n\n//#local menuMainIndex = 1\n//#local menuList = 0\n\n\n//#while menuMainIndex>0\n\n//#local menuList = xml_list(site_file,\"menu\"+menuMainIndex)\n//#if xml_size(menuList)==0\n\t//#local menuList=-1\n\t//#local menuMainIndex = -1\n\t//#continue\n//#endif\t\n//#local menuList = xml_get(menuList,0)\n\n//#local menuSubIndex = 0\n//#local submenuList = xml_list(menuList,\"item\")\n//#local rootMenuNameText = xml_list(menuList,\"textname\")\n//#local rootMenuNameID = \"menu\"+menuMainIndex\n//#if xml_size(rootMenuNameText)==0\n\t//#local rootMenuNameText=\"\"\n//#else\n\t//#local rootMenuNameText = xml_get(rootMenuNameText,0)\n\t//#local rootMenuNameText=str2web(xml_text(xml_get(xml_list(rootMenuNameText,curLangID),0)))\n//#endif\n\n//#local submenuItemsNumber = xml_size(submenuList)\n//#echo SUBITEMS: /*$submenuItemsNumber$*/\n//#while menuSubIndex<submenuItemsNumber\n\n//#local currentItem = xml_get(submenuList,menuSubIndex)\n//#local currentItemID = xml_attr(currentItem,\"id\")\n\n//#local currentItemText = str2web(xml_text(xml_get(xml_list(currentItem,curLangID),0)))\n//#outname rootMenuNameID+\"_\"+currentItemID + \".htm\"\n//#echo making file /*$rootMenuNameID+\"_\"+currentItemID + \".htm\"$*/\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n//#local pageHeader = str2web(xml_text(xml_get(xml_list(xml_get(xml_list(site_file,\"header\"),0),curLangID),0)))\n//#if strlen(rootMenuNameText)==0\n//#local rootMenuNameText2=\"/\"\n//#else\n//#local rootMenuNameText2=\"/\"+rootMenuNameText+\"/\"\n//#endif\n<title>/*$pageHeader+rootMenuNameText2+currentItemText$*/</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t//#if curLangID==\"eng\"\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n    \t\t\t\t\t//#else\n    \t\t\t\t\t\t//#if curLangID==\"rus\"\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n    \t\t\t\t\t    //#endif\n    \t\t\t\t\t//#endif\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n//#local l_menuIndex = 1\n//#while true \n//#local l_mainMenuList = xml_list(site_file,\"menu\"+l_menuIndex)\n//#if xml_size(l_mainMenuList)==0\n//#break\n//#endif\n\n//#local l_curMenu = xml_get(l_mainMenuList,0)\n//#local l_subelementsMenu = xml_list(l_curMenu,\"item\")\n//#local l_menuName = xml_list(l_curMenu,\"textname\")\n//#if xml_size(l_menuName)==0\n  //#local l_spacer = \"\"\n  //#local l_menuName = \"\"\n//#else\n  //#local l_spacer = \"&nbsp;&nbsp;&nbsp;\"\n  //#local l_menuName = xml_text(xml_get(xml_list(xml_get(l_menuName,0),curLangID),0))\n//#endif\n<div>\n//#if strlen(l_menuName)>0\n/*$l_menuName$*/<br>\n//#endif\n//#local l_subMenuItem = 0\n//#while l_subMenuItem<xml_size(l_subelementsMenu)           \n  //#local l_curSubItem = xml_get(l_subelementsMenu,l_subMenuItem)\n \t//#local l_menuName = xml_text(xml_get(xml_list(l_curSubItem,curLangID),0))       \n\t//#local l_menuID = xml_attr(l_curSubItem,\"id\")\n\n    //#local l_appsNumber = -1\n    \n    //#if l_menuIndex>1\n    \t//#local l_appsNumber = 0\n    \t//#local l_gIndex = 0\n    \t//#while l_gIndex<xml_size(games_list)\n    \t\t//#local l_curGame = xml_get(games_list,l_gIndex)\n    \t\t//#if xml_size(xml_list(l_curGame,l_menuID))>0\n\t    \t\t//#local l_appsNumber = l_appsNumber+1\n    \t\t//#endif\n    \t\t//#local l_gIndex = l_gIndex+1\n    \t//#end\n    //#endif\n    //#if l_appsNumber<0\n      //#local l_stringGamesNumber = \"\"\n    //#else\n    \t//#local l_stringGamesNumber = \"&nbsp;(\"+l_appsNumber+\")\"\n    //#endif\n\n\t//#if menuSubIndex == l_subMenuItem && menuMainIndex == l_menuIndex\n      /*$l_spacer$*/<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">/*$l_menuName+l_stringGamesNumber$*/<br>\n\t//#else\n      /*$l_spacer$*/<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"/*$\"./\"+\"menu\"+l_menuIndex+\"_\"+l_menuID + \".htm\"$*/\">/*$l_menuName+l_stringGamesNumber$*/</a><br>\n\t//#endif\n//#local l_subMenuItem = l_subMenuItem + 1\n//#end\n<br></div>\n//#local l_menuIndex = l_menuIndex + 1\n//#end\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n//#local li = 0\n//#while li<langsNumber\n\t//#local locLangID = xml_attr(xml_get(languages,li),\"id\")\n\t//#local locLangText = xml_attr(xml_get(languages,li),\"text\")\n\n\t//#if li==langIndex\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">/*$locLangText$*/</font></div></td>\n\t//#else\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"/*$\"../\"+locLangID+\"/\"+rootMenuNameID+\"_\"+currentItemID+\".htm\"$*/\">/*$locLangText$*/</a></div></td>\n\t//#endif\n//#local li = li +1\n//#end\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>/*$currentItemText$*/</strong></div>\n            </div>\n//#local l_templateID = xml_list(currentItem,\"template\")\n//#if xml_size(l_templateID)>0\n\t//#local l_templateID = xml_text(xml_get(l_templateID,0))\n\t//#include l_templateID\n//#else\n\t//#include \"./\"+currentItemID+\".htm\"  \n//#endif\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n//#include \"./\"+\"hotnews.htm\"  \n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n//#local footer = xml_text(xml_get(xml_list(xml_get(xml_list(site_file,\"footer\"),0),curLangID),0))\n<div align=\"justify\" class=\"footer\">/*$footer$*/</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n//#flush\n//#local menuSubIndex = menuSubIndex + 1\n//#end\n//#local menuMainIndex = menuMainIndex +1\n//#end\n//#local langIndex = langIndex+1\n//#end\n//#outname \"end.txt\""
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/news.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>NEWS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n</head>\n<body>\n//#+\n//#local l_newsList = xml_list(xml_root(xml_open(\"news.xml\")),\"news\")\n//#local l_newsIndex = 0\n//#while l_newsIndex<xml_size(l_newsList)\n//#local l_newsCurrentNews = xml_get(l_newsList,l_newsIndex)\n//#local l_newsCurrentLink = xml_attr(l_newsCurrentNews,\"link\")\n//#local l_newsCurrentNewsContent = xml_text(xml_get(xml_list(l_newsCurrentNews,curLangID),0))\n\n//#local l_newsDate = xml_attr(l_newsCurrentNews,\"date\")\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">/*$l_newsDate$*/</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n//#local l_newsScreen=1\n//#while true\n//#local l_newsCurScreen = xml_list(l_newsCurrentNews,\"scr\"+l_newsScreen)\n//#if xml_size(l_newsCurScreen)==0\n//#break\n//#endif\n//#local l_newsScreenHREF = xml_text(xml_get(l_newsCurScreen,0))\n<img src=\"../news//*$l_newsScreenHREF$*/\" alt=\"/*$\"scr\"+l_newsScreen$*/\">\n//#local l_newsScreen = l_newsScreen + 1\n//#end\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       /*$l_newsCurrentNewsContent$*/\n       </div>\n       //#if strlen(l_newsCurrentLink)>0\n       <div align=\"justify\">\n       //#if curLangID==\"rus\"\n\t\t<span class=\"rightnewsHdr\"><a href=\"/*$l_newsCurrentLink$*/\" target=\"_new\"> ...</a>\n\t\t//#else\n\t\t<span class=\"rightnewsHdr\"><a href=\"/*$l_newsCurrentLink$*/\" target=\"_new\">read more...</a>\n\t\t//#endif\n       </div>\n       //#endif\n       </td>\n    </tr>\n</table>\n<br>\n//#local l_newsIndex = l_newsIndex + 1\n//#end\n//#-\n</body>\n</html>\n//#+"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/news.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<mainnews>\n    <news priority=\"normal\" date=\"05-DEC-2005\" link=\"./gpage_aneks_ny2006.htm\">\n\t\t<scr1>../games/aneks_ny2006_scr1.gif</scr1>\n\t\t<scr2>../games/aneks_ny2006_scr3.gif</scr2>\n  \t\t<rus>&#1042;&#1099;&#1087;&#1091;&#1097;&#1077;&#1085; &#1089;&#1073;&#1086;&#1088;&#1085;&#1080;&#1082; &#1080;&#1079; &#1089;&#1077;&#1088;&#1080;&#1080; \"&#1040;&#1085;&#1077;&#1082;&#1076;&#1086;&#1090;&#1099;\" &#1085;&#1072; &#1053;&#1086;&#1074;&#1086;&#1075;&#1086;&#1076;&#1085;&#1102;&#1102; &#1090;&#1077;&#1084;&#1091;. &#1042; &#1089;&#1073;&#1086;&#1088;&#1085;&#1080;&#1082; &#1074;&#1086;&#1096;&#1083;&#1086; 60 &#1072;&#1085;&#1077;&#1082;&#1076;&#1086;&#1090;&#1086;&#1074;. &#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1087;&#1086;&#1076;&#1076;&#1077;&#1088;&#1078;&#1080;&#1074;&#1072;&#1077;&#1090; &#1087;&#1088;&#1072;&#1082;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1074;&#1089;&#1077; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1099;&#1077; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1099; &#1089; &#1087;&#1083;&#1072;&#1090;&#1092;&#1086;&#1088;&#1084;&#1086;&#1081; MIDP-1.0</rus>\n        <eng>The collection \"Ney Year's jokes\" has been completed. The collection includes 60 jokes. It supports all MIDP-1.0 Java2ME mobile devices.</eng>\n\t</news>\n    <news priority=\"normal\" date=\"25-NOV-2005\" link=\"./gpage_slider_alpop.htm\">\n\t\t<scr1>../games/slider_alpop_scr1.gif</scr1>\n  \t\t<rus>&#1042;&#1099;&#1096;&#1077;&#1083; &#1089;&#1083;&#1072;&#1081;&#1076;&#1077;&#1088; &#1087;&#1086; &#1084;&#1091;&#1083;&#1100;&#1090;&#1092;&#1080;&#1083;&#1100;&#1084;&#1091; \"&#1040;&#1083;&#1077;&#1096;&#1072; &#1055;&#1086;&#1087;&#1086;&#1074;&#1080;&#1095; &#1080; &#1058;&#1091;&#1075;&#1072;&#1088;&#1080;&#1085; &#1047;&#1084;&#1077;&#1081;\". &#1057;&#1083;&#1072;&#1081;&#1076;&#1077;&#1088; &#1089;&#1086;&#1076;&#1077;&#1088;&#1078;&#1080;&#1090; 10 &#1082;&#1088;&#1072;&#1089;&#1086;&#1095;&#1085;&#1099;&#1093; &#1082;&#1072;&#1076;&#1088;&#1086;&#1074; &#1080;&#1079; &#1084;&#1091;&#1083;&#1100;&#1090;&#1092;&#1080;&#1083;&#1100;&#1084;&#1072; &#1080; &#1090;&#1077;&#1082;&#1089;&#1090;.</rus>\n        <eng>The slide-show \"Aleosha Popovich and Toogarin Zmey\" has been completed. The slide-show includes 10 frames from the cartoon film and texts.</eng>\n\t</news>\n    <news priority=\"normal\" date=\"10-SEP-2005\" link=\"./gpage_smscat.htm\">\n\t\t<scr1>../games/smscat_scr2.gif</scr1>\n        <scr2>../games/smscat_scr3.gif</scr2>\n  \t\t<rus>&#1047;&#1072;&#1082;&#1086;&#1085;&#1095;&#1077;&#1085;&#1072; &#1088;&#1072;&#1079;&#1088;&#1072;&#1073;&#1086;&#1090;&#1082;&#1072; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1103; \"SMS Catalog\". &#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1077;&#1090; &#1087;&#1086;&#1090;&#1077;&#1085;&#1094;&#1080;&#1072;&#1083;&#1100;&#1085;&#1099;&#1084; &#1082;&#1083;&#1080;&#1077;&#1085;&#1090;&#1072;&#1084; &#1086;&#1079;&#1085;&#1072;&#1082;&#1072;&#1084;&#1083;&#1080;&#1074;&#1072;&#1090;&#1100;&#1089;&#1103; &#1089; &#1089;&#1086;&#1076;&#1077;&#1088;&#1078;&#1080;&#1084;&#1099;&#1084; &#1073;&#1072;&#1079;&#1099; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;&#1072;, &#1086;&#1088;&#1075;&#1072;&#1085;&#1080;&#1079;&#1086;&#1074;&#1072;&#1085;&#1085;&#1086;&#1081; &#1074; &#1091;&#1076;&#1086;&#1073;&#1085;&#1086;&#1084; &#1076;&#1088;&#1077;&#1074;&#1086;&#1074;&#1080;&#1076;&#1085;&#1086;&#1084; &#1087;&#1088;&#1077;&#1076;&#1089;&#1090;&#1072;&#1074;&#1083;&#1077;&#1085;&#1080;&#1080; &#1080; (&#1077;&#1089;&#1083;&#1080; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085; &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1077;&#1090;) &#1092;&#1086;&#1088;&#1084;&#1080;&#1088;&#1086;&#1074;&#1072;&#1090;&#1100; SMS &#1089; &#1079;&#1072;&#1082;&#1072;&#1079;&#1086;&#1084; &#1087;&#1086;&#1085;&#1088;&#1072;&#1074;&#1080;&#1074;&#1096;&#1077;&#1075;&#1086;&#1089;&#1103; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;&#1072;.</rus>\n        <eng>The \"SMS Catalog\" application has been developed. It enables for user to look through a content provider base and order liked content with automatically generated SMS (if the device is supporting).</eng>\n\t</news>\n    <news priority=\"normal\" date=\"01-AUG-2005\" link=\"./gpage_airboil.htm\">\n\t\t<scr1>../games/airboil_scr1.gif</scr1>\n        <scr2>../games/airboil_scr3.gif</scr2>\n  \t\t<rus>&#1042;&#1099;&#1096;&#1083;&#1072; &#1080;&#1075;&#1088;&#1072; \"Air Boil\". &#1048;&#1075;&#1088;&#1072; &#1103;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1072;&#1088;&#1082;&#1072;&#1076;&#1086;&#1081; &#1074;&#1099;&#1087;&#1086;&#1083;&#1085;&#1077;&#1085;&#1085;&#1086;&#1081; &#1074; &#1082;&#1083;&#1072;&#1089;&#1089;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1084; &#1089;&#1090;&#1080;&#1083;&#1077;. &#1048;&#1075;&#1088;&#1086;&#1082;&#1091; &#1090;&#1088;&#1077;&#1073;&#1091;&#1077;&#1090;&#1089;&#1103; &#1087;&#1088;&#1086;&#1093;&#1086;&#1076;&#1080;&#1090;&#1100; &#1080;&#1075;&#1088;&#1086;&#1074;&#1099;&#1077; &#1091;&#1088;&#1086;&#1074;&#1085;&#1080; &#1089; &#1085;&#1072;&#1088;&#1072;&#1089;&#1090;&#1072;&#1102;&#1097;&#1077;&#1081; &#1089;&#1083;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1100;&#1102;, &#1082;&#1072;&#1078;&#1076;&#1072;&#1103; &#1075;&#1088;&#1091;&#1087;&#1087;&#1072; &#1091;&#1088;&#1086;&#1074;&#1085;&#1077;&#1081; &#1079;&#1072;&#1082;&#1072;&#1085;&#1095;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; &#1074;&#1089;&#1090;&#1088;&#1077;&#1095;&#1077;&#1081; &#1089; \"&#1073;&#1086;&#1089;&#1089;&#1086;&#1084;\".</rus>\n        <eng>The game \"Air Boil\" has been completed. The game is a classic style arcade game. A player should pass game stages. Game stages have different difficult of the gameplay, every group of game stages has a game \"boss\" what must be destroyed by the player.</eng>\n\t</news>\n    <news priority=\"normal\" date=\"29-JUN-2005\" link=\"./gpage_starharbor.htm\">\n\t\t<scr1>../games/starharbor_scr1.gif</scr1>\n        <scr2>../games/starharbor_scr2.gif</scr2>\n  \t\t<rus>&#1059;&#1096;&#1083;&#1072; &#1074; &#1087;&#1088;&#1086;&#1076;&#1072;&#1078;&#1091; &#1080;&#1075;&#1088;&#1072; \"Star Harbor\". &#1048;&#1075;&#1088;&#1072; &#1103;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1087;&#1089;&#1077;&#1074;&#1076;&#1086;&#1090;&#1088;&#1077;&#1093;&#1084;&#1077;&#1088;&#1085;&#1099;&#1084; &#1096;&#1091;&#1090;&#1077;&#1088;&#1086;&#1084; &#1086;&#1090; &#1087;&#1077;&#1088;&#1074;&#1086;&#1075;&#1086; &#1083;&#1080;&#1094;&#1072;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1080;&#1075;&#1088;&#1072;&#1077;&#1090; &#1079;&#1072; &#1089;&#1090;&#1088;&#1077;&#1083;&#1082;&#1072; &#1090;&#1091;&#1088;&#1077;&#1083;&#1080; &#1082;&#1086;&#1089;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1075;&#1086; &#1082;&#1088;&#1077;&#1081;&#1089;&#1077;&#1088;&#1072; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; - &#1086;&#1090;&#1088;&#1072;&#1079;&#1080;&#1090;&#1100; &#1074;&#1090;&#1086;&#1088;&#1078;&#1077;&#1085;&#1080;&#1077; &#1080;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1085;&#1099;&#1093; &#1089;&#1080;&#1083; &#1085;&#1072; &#1047;&#1077;&#1084;&#1083;&#1102;. &#1048;&#1075;&#1088;&#1072; &#1080;&#1084;&#1077;&#1077;&#1090; &#1090;&#1088;&#1080; &#1091;&#1088;&#1086;&#1074;&#1085;&#1103; &#1089;&#1083;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1080; &#1080; &#1074;&#1093;&#1086;&#1076;&#1080;&#1090; &#1074; &#1088;&#1072;&#1079;&#1088;&#1103;&#1076; timekiller &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1081;. &#1055;&#1086;&#1076;&#1076;&#1077;&#1088;&#1078;&#1080;&#1074;&#1072;&#1077;&#1090; &#1073;&#1086;&#1083;&#1077;&#1077; 100 &#1084;&#1086;&#1076;&#1077;&#1083;&#1077;&#1081; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1086;&#1074;, &#1074; &#1090;&#1086;&#1084; &#1095;&#1080;&#1089;&#1083;&#1077; &#1085;&#1077;&#1089;&#1082;&#1086;&#1083;&#1100;&#1082;&#1086; &#1095;&#1077;&#1088;&#1085;&#1086;-&#1073;&#1077;&#1083;&#1099;&#1093; &#1084;&#1086;&#1076;&#1077;&#1083;&#1077;&#1081; Nokia &#1080; Siemens.</rus>\n        <eng>The \"Star Harbor\" game has come into the market. The game is a pseudo 3d shooter. A player is a brawe star cruiser gunner and the task is to destroy both enemy cruisers and fighters that are attacking the Earth. It is a timekiller game and it has three levels of complexity. The game supports more than 100 models of mobile devices including a few black white devices of Nokia and Siemens.</eng>\n\t</news>\n\t<news priority=\"normal\" date=\"29-JUN-2005\">\n  \t\t<rus>&#1040;&#1083;&#1100;&#1092;&#1072;-&#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1089;&#1072;&#1081;&#1090;&#1072; &#1074;&#1099;&#1083;&#1086;&#1078;&#1077;&#1085;&#1072; &#1074; &#1080;&#1085;&#1090;&#1077;&#1088;&#1085;&#1077;&#1090;. &#1050; &#1089;&#1086;&#1078;&#1072;&#1083;&#1077;&#1085;&#1080;&#1102; &#1085;&#1077; &#1074;&#1089;&#1077; &#1088;&#1072;&#1079;&#1076;&#1077;&#1083;&#1099; &#1077;&#1097;&#1077; &#1092;&#1091;&#1085;&#1082;&#1094;&#1080;&#1086;&#1085;&#1080;&#1088;&#1091;&#1102;&#1090;, &#1085;&#1086; &#1082;&#1072;&#1082; &#1075;&#1086;&#1074;&#1086;&#1088;&#1080;&#1090;&#1089;&#1103; \"..&#1101;&#1090;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1086;&#1081; &#1096;&#1072;&#1075; &#1076;&#1083;&#1103; &#1074;&#1089;&#1077;&#1075;&#1086; &#1095;&#1077;&#1083;&#1086;&#1074;&#1077;&#1095;&#1077;&#1089;&#1090;&#1074;&#1072;\".</rus>\n        <eng>The alpha version of the site has been placed in the net. Unfortunately a few pages of the site are not working but we're working for it.</eng>\n\t</news>\n</mainnews>"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/partnership.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body>\n//#+\n<p align=\"center\"><strong><em><font size=\"4\">Sorry, but the page is still under \n  construction....</font></em></strong></p>\n<p align=\"center\"><img src=\"../undercon.gif\" width=\"40\" height=\"38\"></p>\n<p align=\"center\"><strong><font size=\"4\"><em>Visit us later, please...</em></font></strong></p>\n\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/rus/send_error.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>   .</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#FF9393\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../x_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>   ,    .   .</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/rus/send_ok.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>  .</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#C4CFFF\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../i_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>   . !</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/site.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<site>\n\t<languages>\n\t\t<lang id=\"rus\" text=\"RUS\"/>\n\t\t<lang id=\"eng\" text=\"ENG\"/>\n\t</languages>\n\n    <header>\n\t\t<rus>ColdCore</rus>\n        <eng>ColdCore</eng>\n    </header>\n\n\t<menu1>\n\t\t<item id=\"news\">\n\t\t  \t<rus>&#1053;&#1054;&#1042;&#1054;&#1057;&#1058;&#1048;</rus>\n\t\t  \t<eng>NEWS</eng>\n\t\t</item>\t\n        <item id=\"about\">\n\t\t  \t<rus>&#1054; &#1053;&#1040;&#1057;</rus>\n\t\t  \t<eng>ABOUT</eng>\n\t\t</item>\t\n        <item id=\"partnership\">\n\t\t  \t<rus>&#1055;&#1040;&#1056;&#1058;&#1053;&#1045;&#1056;&#1057;&#1058;&#1042;&#1054;</rus>\n\t\t  \t<eng>PARTNERSHIP</eng>\n\t\t</item>\t\n        <item id=\"job\">\n\t\t  \t<rus>&#1042;&#1040;&#1050;&#1040;&#1053;&#1057;&#1048;&#1048;</rus>\n\t\t  \t<eng>JOB</eng>\n\t\t</item>\t\n        <item id=\"contacts\">\n\t\t  \t<rus>&#1050;&#1054;&#1053;&#1058;&#1040;&#1050;&#1058;&#1067;</rus>\n\t\t  \t<eng>CONTACTS</eng>\n\t\t</item>\t\n\t</menu1>\n\n    <menu2>\n\t\t<textname>\n\t\t  <rus>&#1048;&#1043;&#1056;&#1067;</rus>\n          <eng>GAMES</eng>\n\t\t</textname>\n\t\t<item id=\"all\">\n\t\t\t<template>gamelist.htm</template>\n\t\t  \t<rus>&#1042;&#1057;&#1045;</rus>\n\t\t  \t<eng>ALL</eng>\n\t\t</item>\t\n        <item id=\"arcade\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1040;&#1056;&#1050;&#1040;&#1044;&#1067;</rus>\n\t\t  \t<eng>ARCADE</eng>\n\t\t</item>\t\n        <item id=\"erotic\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1069;&#1056;&#1054;&#1058;&#1048;&#1063;&#1045;&#1057;&#1050;&#1048;&#1045;</rus>\n\t\t  \t<eng>EROTIC</eng>\n\t\t</item>\t\n        <item id=\"fighting\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1044;&#1056;&#1040;&#1050;&#1048;</rus>\n\t\t  \t<eng>FIGHTING</eng>\n\t\t</item>\t\n        <item id=\"gambling\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1040;&#1047;&#1040;&#1056;&#1058;&#1053;&#1067;&#1045;</rus>\n\t\t  \t<eng>GAMBLING</eng>\n\t\t</item>\t\n        <item id=\"logic\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1051;&#1054;&#1043;&#1048;&#1063;&#1045;&#1057;&#1050;&#1048;&#1045;</rus>\n\t\t  \t<eng>PUZZLE</eng>\n\t\t</item>\t\n        <item id=\"multiplayer\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1052;&#1059;&#1051;&#1068;&#1058;&#1048;&#1055;&#1051;&#1045;&#1045;&#1056;</rus>\n\t\t  \t<eng>MULTIPLAYER</eng>\n\t\t</item>\t\n        <item id=\"clientserver\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1050;&#1051;&#1048;&#1045;&#1053;&#1058;-&#1057;&#1045;&#1056;&#1042;&#1045;&#1056;</rus>\n\t\t  \t<eng>CLIENT-SERVER</eng>\n\t\t</item>\t\n        <item id=\"quest\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1050;&#1042;&#1045;&#1057;&#1058;&#1067;</rus>\n\t\t  \t<eng>QUEST</eng>\n\t\t</item>\t\n        <item id=\"racing\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1043;&#1054;&#1053;&#1050;&#1048;</rus>\n\t\t  \t<eng>RACING</eng>\n\t\t</item>\t\n        <item id=\"shooter\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1057;&#1058;&#1056;&#1045;&#1051;&#1071;&#1051;&#1050;&#1048;</rus>\n\t\t  \t<eng>SHOOTER</eng>\n\t\t</item>\t\n        <item id=\"sport\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1057;&#1055;&#1054;&#1056;&#1058;</rus>\n\t\t  \t<eng>SPORT</eng>\n\t\t</item>\t\n\t</menu2>\n\n    <menu3>\n\t\t<textname>\n\t\t  <rus>&#1055;&#1056;&#1048;&#1051;&#1054;&#1046;&#1045;&#1053;&#1048;&#1071;</rus>\n          <eng>APPLICATIONS</eng>\n\t\t</textname>\n\t\t<item id=\"appsall\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1042;&#1057;&#1045;</rus>\n\t\t  \t<eng>ALL</eng>\n\t\t</item>\t\n\t</menu3>\n\n\t<footer>\n\t\t<rus>Copyright &#169; ColdCore&#174; 2005-2007. &#1057;&#1080;&#1084;&#1074;&#1086;&#1083;&#1099; \"&#8482;\" &#1080; \"&#174;\" &#1087;&#1086;&#1082;&#1072;&#1079;&#1099;&#1074;&#1072;&#1102;&#1090; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077; &#1084;&#1072;&#1088;&#1082;&#1080; &#1080; &#1079;&#1072;&#1088;&#1077;&#1075;&#1080;&#1089;&#1090;&#1088;&#1080;&#1088;&#1086;&#1074;&#1072;&#1085;&#1085;&#1099;&#1077; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077; &#1084;&#1072;&#1088;&#1082;&#1080; &#1080;&#1093; &#1087;&#1086;&#1083;&#1085;&#1086;&#1087;&#1088;&#1072;&#1074;&#1085;&#1099;&#1093; &#1074;&#1083;&#1072;&#1076;&#1077;&#1083;&#1100;&#1094;&#1077;&#1074;.</rus>\n        <eng>&#169; 2005-2007 ColdCore&#174;. All rights reserved. \"&#8482;\" and \"&#174;\" indicate trademarks or registered trademarks of their respective owners.</eng>\n    </footer>\n</site>"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StaticSiteTest/src/wap/index.wml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n<wml>\n<card id=\"main\" title=\"COLDCORE WAP\">\n<p>\n<img src=\"/logo.wbmp\" alt=\"ColdCore(R)\"/>\n<br/><br/>\n<strong>Sorry, under construction...</strong>\n<do type=\"option\" label=\"Back\"><prev/></do>\n</p>\n</card>\n</wml>\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/Str2JavaTest/etl/text.txt",
    "content": "public class Hello {\n    public void say() {\n        System.out.println(\"Hello\");\n    }\n}\n\npublic class Test {\n    public static void main(String[] args) throws Exception {\n        ClassPool cp = ClassPool.getDefault();\n        CtClass cc = cp.get(\"Hello\");\n        CtMethod m = cc.getDeclaredMethod(\"say\");\n        m.insertBefore(\n          \"System.out.println(\\\"Hello World\\\");\\n\"\n+\"System.out.println(\\\"Hello World2\\\");\\n\"\n        );\n        System.out.println(\"Just some string\");\n        Class c = cc.toClass();\n        Hello h = (Hello)c.newInstance();\n        h.say();\n    }\n}\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/Str2JavaTest/src/body.txt",
    "content": "//#excludeif true\n//#-\nimport some.package;\n\npublic class Body {\n\npublic void main(){\n//#+\nSystem.out.println(\"Hello World\");\nSystem.out.println(\"Hello World2\");\n//#-\n  }\n}\n//#+"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/Str2JavaTest/src/str.txt",
    "content": "//#excludeif true\nJust some string"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/Str2JavaTest/src/text.txt",
    "content": "public class Hello {\n    public void say() {\n        System.out.println(\"Hello\");\n    }\n}\n\npublic class Test {\n    public static void main(String[] args) throws Exception {\n        ClassPool cp = ClassPool.getDefault();\n        CtClass cc = cp.get(\"Hello\");\n        CtMethod m = cc.getDeclaredMethod(\"say\");\n        m.insertBefore(\n          /*$str2java(evalfile(\"body.txt\"),true)$*//*-*/\"\"\n        );\n        System.out.println(\"/*$str2java(evalfile(\"str.txt\"),false)$*/\");\n        Class c = cc.toClass();\n        Hello h = (Hello)c.newInstance();\n        h.say();\n    }\n}\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StringDirectiveTest/etl/text.txt",
    "content": " expected world\n expected /*$HELLO$*/\ntest \n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/StringDirectiveTest/src/text.txt",
    "content": "//#define HELLO \"world\"\n//#if false\n//$ unexpected /*$HELLO$*/\n//#else\n//$ expected /*$HELLO$*/\n//#endif\n//#if false\n//$$ unexpected /*$HELLO$*/\n//#else\n//$$ expected /*$HELLO$*/\n//#endif\n//#if false\ntest /*-*/unexpected\n//#else\ntest /*-*/expected\n//#endif\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/TextBufferVariablesTest/etl/text.txt",
    "content": "set prefix---\nSome block text which\nwill be placed into a variable as multiline text\nand prefix buffer is used to accumulate it\n\n===\n---\nSome block text which\nwill be placed into a variable as multiline text\nand prefix buffer is used to accumulate it\n\n===\n\n...\nset postfix"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/TextBufferVariablesTest/src/text.txt",
    "content": "//#postfix+\ndefined postfix\n//#postfix-\n//#prefix+\nSome block text which\nwill be placed into a variable as multiline text\nand prefix buffer is used to accumulate it\n//#prefix-\n//#local multiline_prefix = jcp.text.buffer.prefix\n//#local jcp.text.buffer.prefix=\"set prefix\"\n//#local jcp.text.buffer.postfix=\"set postfix\"\n---\n//$/*$multiline_prefix$*/\n===\n//$/*$jcp.text.buffer.middle$*/\n..."
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/UnknownVarAsFalseTest/etl/body.txt",
    "content": "false\n123false\nmust be\nhuzzaaaaa!\n---\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/UnknownVarAsFalseTest/src/body.txt",
    "content": "/*$UNKNOWN_VAR$*/\n/*$\"123\"+UGUMS$*/\n//#if !ANOTHER_UNKNWOWN\nmust be\n//#else\nmust not be\n//#endif\n//#ifndef HUZZAA\nhuzzaaaaa!\n//#endif\n//#ifdefined SOMEUNKNOWN\nhmmmmmm\n//#endif\n//#ifdef HMMML\nnoooooo!!!!!\n//#endif\n---"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/UsePrefixAsMultilineTest/etl/text.txt",
    "content": "package test;\n\npublic class Main {\n public static final int mul(int a, b) {\n     return a * b;\n }\n\n\n public static final int div(int a, b) {\n     return a / b;\n }\n\n}\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/UsePrefixAsMultilineTest/src/text.txt",
    "content": "//#prefix+\n//$ public static final int mul(int a, b) {\n//$     return a * b;\n//$ }\n//#prefix-\n//#postfix+\n//$ public static final int div(int a, b) {\n//$     return a / b;\n//$ }\n//#postfix-\n//#local mul_func = jcp.text.buffer.prefix\n//#local div_func = jcp.text.buffer.postfix\n//#local jcp.text.buffer.prefix = \"\"\n//#local jcp.text.buffer.postfix = \"\"\npackage test;\n\npublic class Main {\n/*$mul_func$*/\n\n/*$div_func$*/\n}"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/UserFunctionTest/etl/text.txt",
    "content": "hello test:yayaya\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/usecases/UserFunctionTest/src/text.txt",
    "content": "//#action 1000,\"hello\",123\nhello /*$\"test:\"+$testfunc(1,\"hry\",3)$*/\n//#action 1000,\"hello\",123\n"
  },
  {
    "path": "jcp/src/test/resources/com/igormaznitsa/jcp/utils/somefile.txt",
    "content": "it's just a some file"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/build.gradle",
    "content": "// section for preprocessor\nbuildscript {\n    repositories {\n        flatDir dirs: \"../../../jcp/target\"\n    }\n    dependencies {\n        classpath \"com.igormaznitsa:jcp:\" + project.getProperty(\"jcp_plugin_version\")\n    }\n}\napply plugin: 'com.igormaznitsa.jcp'\n// end section for preprocessor\n\napply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 28\n    defaultConfig {\n        applicationId \"android.it.igormaznitsa.com.jcpandroid\"\n        minSdkVersion 15\n        targetSdkVersion 28\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation 'com.android.support:appcompat-v7:28.0.0'\n    implementation 'com.android.support.constraint:constraint-layout:1.1.3'\n    implementation 'com.android.support:design:28.0.0'\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n}\n\npreprocess {\n    sources = android.sourceSets.main.java.srcDirs\n    keepComments = false\n    actionPreprocessorExtensions = [\"com.igormaznitsa.jcp.extension.LogPreprocessorExtension\"]\n    vars = [\n            'action.text'  : 'Non-secret action!',\n            'remove.secret': 'true'\n    ]\n}\n\ntask(changeSourceFolder) {\n    android.sourceSets.main.java.srcDirs = [preprocess.target]\n}.dependsOn preprocess\n\npreBuild.dependsOn preprocess\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/androidTest/java/android/it/igormaznitsa/com/jcpandroid/ExampleInstrumentedTest.java",
    "content": "package android.it.igormaznitsa.com.jcpandroid;\n\nimport android.content.Context;\nimport android.it.igormaznitsa.com.jcpandroid.utils.Utils;\nimport android.support.test.InstrumentationRegistry;\nimport android.support.test.runner.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n  @Test\n  public void useAppContext() {\n    Context appContext = InstrumentationRegistry.getTargetContext();\n    assertEquals(\"android.it.igormaznitsa.com.jcpandroid\", appContext.getPackageName());\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"android.it.igormaznitsa.com.jcpandroid\">\n\n    <application\n            android:allowBackup=\"true\"\n            android:icon=\"@mipmap/ic_launcher\"\n            android:label=\"@string/app_name\"\n            android:roundIcon=\"@mipmap/ic_launcher_round\"\n            android:supportsRtl=\"true\"\n            android:theme=\"@style/AppTheme\">\n        <activity\n                android:name=\".MainActivity\"\n                android:label=\"@string/app_name\"\n                android:theme=\"@style/AppTheme.NoActionBar\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/java/android/it/igormaznitsa/com/jcpandroid/MainActivity.java",
    "content": "package android.it.igormaznitsa.com.jcpandroid;\n\nimport android.os.Bundle;\nimport android.support.design.widget.FloatingActionButton;\nimport android.support.design.widget.Snackbar;\nimport android.support.v7.app.AppCompatActivity;\nimport android.support.v7.widget.Toolbar;\nimport android.view.View;\nimport android.view.Menu;\nimport android.view.MenuItem;\n\npublic class MainActivity extends AppCompatActivity {\n\n  @Override\n  protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_main);\n    Toolbar toolbar = findViewById(R.id.toolbar);\n    setSupportActionBar(toolbar);\n\n    FloatingActionButton fab = findViewById(R.id.fab);\n    fab.setOnClickListener(new View.OnClickListener() {\n      @Override\n      public void onClick(View view) {\n        //#if remove.secret\n        //$ Snackbar.make(view, \"/*$action.text$*/\", Snackbar.LENGTH_LONG).setAction(\"Action\", null).show();\n        //#else\n        Snackbar.make(view, \"Replace with your own action\", Snackbar.LENGTH_LONG).setAction(\"Action\", null).show();\n        //#endif\n      }\n    });\n  }\n\n  @Override\n  public boolean onCreateOptionsMenu(Menu menu) {\n    // Inflate the menu; this adds items to the action bar if it is present.\n    getMenuInflater().inflate(R.menu.menu_main, menu);\n    return true;\n  }\n\n  @Override\n  public boolean onOptionsItemSelected(MenuItem item) {\n    // Handle action bar item clicks here. The action bar will\n    // automatically handle clicks on the Home/Up button, so long\n    // as you specify a parent activity in AndroidManifest.xml.\n    int id = item.getItemId();\n\n    //noinspection SimplifiableIfStatement\n    if (id == R.id.action_settings) {\n      return true;\n    }\n\n    return super.onOptionsItemSelected(item);\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/java/android/it/igormaznitsa/com/jcpandroid/utils/Utils.java",
    "content": "package android.it.igormaznitsa.com.jcpandroid.utils;\n\npublic final class Utils {\n\n  private Utils(){\n\n  }\n\n  //#if remove.secret\n  //$public static String makeSecretPassword() {\n  //$  return \"testPassword\";\n  //$}\n  //#else\n  public static String makeSecretPassword() {\n    return \"122sdsferSSADSD123232\";\n  }\n  //#endif\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:height=\"108dp\"\n        android:width=\"108dp\"\n        android:viewportHeight=\"108\"\n        android:viewportWidth=\"108\">\n    <path android:fillColor=\"#008577\"\n          android:pathData=\"M0,0h108v108h-108z\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M9,0L9,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,0L19,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,0L29,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,0L39,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,0L49,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,0L59,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,0L69,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,0L79,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M89,0L89,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M99,0L99,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,9L108,9\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,19L108,19\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,29L108,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,39L108,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,49L108,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,59L108,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,69L108,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,79L108,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,89L108,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,99L108,99\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,29L89,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,39L89,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,49L89,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,59L89,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,69L89,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,79L89,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,19L29,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,19L39,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,19L49,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,19L59,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,19L69,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,19L79,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n</vector>\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:aapt=\"http://schemas.android.com/aapt\"\n        android:width=\"108dp\"\n        android:height=\"108dp\"\n        android:viewportHeight=\"108\"\n        android:viewportWidth=\"108\">\n    <path\n            android:fillType=\"evenOdd\"\n            android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n            android:strokeColor=\"#00000000\"\n            android:strokeWidth=\"1\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                    android:endX=\"78.5885\"\n                    android:endY=\"90.9159\"\n                    android:startX=\"48.7653\"\n                    android:startY=\"61.0927\"\n                    android:type=\"linear\">\n                <item\n                        android:color=\"#44000000\"\n                        android:offset=\"0.0\"/>\n                <item\n                        android:color=\"#00000000\"\n                        android:offset=\"1.0\"/>\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n            android:fillColor=\"#FFFFFF\"\n            android:fillType=\"nonZero\"\n            android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n            android:strokeColor=\"#00000000\"\n            android:strokeWidth=\"1\"/>\n</vector>\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.design.widget.CoordinatorLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".MainActivity\">\n\n    <android.support.design.widget.AppBarLayout\n            android:layout_height=\"wrap_content\"\n            android:layout_width=\"match_parent\"\n            android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <android.support.v7.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?attr/actionBarSize\"\n                android:background=\"?attr/colorPrimary\"\n                app:popupTheme=\"@style/AppTheme.PopupOverlay\"/>\n\n    </android.support.design.widget.AppBarLayout>\n\n    <include layout=\"@layout/content_main\"/>\n\n    <android.support.design.widget.FloatingActionButton\n            android:id=\"@+id/fab\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom|end\"\n            android:layout_margin=\"@dimen/fab_margin\"\n            app:srcCompat=\"@android:drawable/ic_dialog_email\"/>\n\n</android.support.design.widget.CoordinatorLayout>"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/layout/content_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.constraint.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        tools:showIn=\"@layout/activity_main\"\n        tools:context=\".MainActivity\">\n\n    <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Hello World!\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"/>\n\n</android.support.constraint.ConstraintLayout>"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/menu/menu_main.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n      xmlns:tools=\"http://schemas.android.com/tools\"\n      tools:context=\"android.it.igormaznitsa.com.jcpandroid.MainActivity\">\n    <item android:id=\"@+id/action_settings\"\n          android:title=\"@string/action_settings\"\n          android:orderInCategory=\"100\"\n          app:showAsAction=\"never\"/>\n</menu>\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#008577</color>\n    <color name=\"colorPrimaryDark\">#00574B</color>\n    <color name=\"colorAccent\">#D81B60</color>\n</resources>\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <dimen name=\"fab_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">JcpAndroid</string>\n    <string name=\"action_settings\">Settings</string>\n</resources>\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n    <style name=\"AppTheme.NoActionBar\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n    <style name=\"AppTheme.AppBarOverlay\" parent=\"ThemeOverlay.AppCompat.Dark.ActionBar\"/>\n    <style name=\"AppTheme.PopupOverlay\" parent=\"ThemeOverlay.AppCompat.Light\"/>\n\n</resources>\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/test/java/android/it/igormaznitsa/com/jcpandroid/ExampleUnitTest.java",
    "content": "package android.it.igormaznitsa.com.jcpandroid;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\npublic class ExampleUnitTest {\n  @Test\n  public void addition_isCorrect() {\n    assertEquals(4, 2 + 2);\n  }\n}"
  },
  {
    "path": "jcp-tests/jcp-test-android/app/src/test/java/android/it/igormaznitsa/com/jcpandroid/utils/UtilsTest.java",
    "content": "package android.it.igormaznitsa.com.jcpandroid.utils;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\npublic class UtilsTest {\n  @Test\n  public void testMakeSecretPassword(){\n    assertEquals(\"testPassword\", Utils.makeSecretPassword());\n  }\n}"
  },
  {
    "path": "jcp-tests/jcp-test-android/build.gradle",
    "content": "buildscript {\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.1.0'\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\n\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/local.properties",
    "content": "## This file is automatically generated by Android Studio.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# This file should *NOT* be checked into Version Control Systems,\n# as it contains information specific to your local configuration.\n#\n# Location of the SDK. This is only used by Gradle.\n# For customization when using a Version Control System, please read the\n# header note.\nsdk.dir=/home/igorm/SDK/android\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <parent>\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>jcp-tests</artifactId>\n    <version>0-SNAPSHOT</version>\n  </parent>\n\n  <artifactId>jcp-test-android</artifactId>\n  <packaging>pom</packaging>\n\n  <build>\n    <plugins>\n      <plugin>\n        <artifactId>maven-clean-plugin</artifactId>\n        <version>3.1.0</version>\n        <configuration>\n          <filesets>\n            <fileset>\n              <directory>${project.basedir}/gradle</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/.gradle</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}</directory>\n              <includes>\n                <include>gradlew</include>\n                <include>gradlew.bat</include>\n              </includes>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}${file.separator}app</directory>\n              <includes>\n                <include>gradlew</include>\n                <include>gradlew.bat</include>\n              </includes>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/downloaded</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}${file.separator}build</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}${file.separator}app${file.separator}build</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}${file.separator}out</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}${file.separator}app${file.separator}out</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n          </filesets>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.codehaus.mojo</groupId>\n        <artifactId>exec-maven-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>gradle</id>\n            <phase>compile</phase>\n            <configuration>\n              <executable>${gradle6.executable}</executable>\n              <arguments>\n                <argument>clean</argument>\n                <argument>test</argument>\n                <argument>build</argument>\n                <argument>-i</argument>\n                <argument>-S</argument>\n                <argument>-Pjcp_plugin_version=${jcp.test.version}</argument>\n              </arguments>\n            </configuration>\n            <goals>\n              <goal>exec</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n    </plugins>\n  </build>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-android/settings.gradle",
    "content": "include ':app'\n"
  },
  {
    "path": "jcp-tests/jcp-test-ant/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>com.igormaznitsa</groupId>\n        <artifactId>jcp-tests</artifactId>\n        <version>0-SNAPSHOT</version>\n    </parent>\n\n    <artifactId>jcp-test-ant</artifactId>\n    <packaging>jar</packaging>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.apache.ant</groupId>\n            <artifactId>ant</artifactId>\n            <version>1.10.15</version>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-clean-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>force-clean</id>\n                        <goals>\n                            <goal>clean</goal>\n                        </goals>\n                        <phase>initialize</phase>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <configuration>\n                    <systemPropertyVariables>\n                        <jcp.target.folder>${project.build.directory}${file.separator}preprocessResult\n                        </jcp.target.folder>\n                    </systemPropertyVariables>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-antrun-plugin</artifactId>\n                <version>3.1.0</version>\n                <executions>\n                    <execution>\n                        <id>preprocess-test-resources</id>\n                        <goals>\n                            <goal>run</goal>\n                        </goals>\n                        <phase>generate-test-resources</phase>\n                        <configuration>\n                            <target>\n                                <ant\n                                        dir=\"${project.basedir}${file.separator}src${file.separator}test${file.separator}resources\"\n                                        antfile=\"build.xml\"\n                                        inheritall=\"false\"\n                                        useNativeBasedir=\"false\"\n                                >\n                                    <property name=\"jcp.target.folder\"\n                                              value=\"${project.build.directory}${file.separator}preprocessResult\"/>\n                                </ant>\n                            </target>\n                        </configuration>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>com.igormaznitsa</groupId>\n                        <artifactId>jcp</artifactId>\n                        <version>${jcp.test.version}</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-ant/src/test/java/com/igormaznitsa/jcp/it/ant/TestAntTaskResult.java",
    "content": "/*\n * Copyright 2019 Igor Maznitsa.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.igormaznitsa.jcp.it.ant;\n\nimport org.apache.tools.ant.util.FileUtils;\nimport org.junit.jupiter.api.Test;\n\nimport java.io.File;\nimport java.io.FileReader;\nimport java.io.Reader;\n\nimport static org.junit.jupiter.api.Assertions.assertFalse;\nimport static org.junit.jupiter.api.Assertions.assertTrue;\n\npublic class TestAntTaskResult {\n\n  private final File RESULT_FOLDER = new File(System.getProperty(\"jcp.target.folder\"));\n\n  @Test\n  public void testPreprocessResult() throws Exception {\n\n    System.out.println(\"RESULT FOLDER: \" + RESULT_FOLDER);\n\n    assertTrue(RESULT_FOLDER.isDirectory(), \"Target folder must be created\");\n    final File folder = new File(RESULT_FOLDER, \"com/igormaznitsa/dummyproject\");\n    final File originalFile = new File(folder, \"main.java\");\n    final File resultFile = new File(folder, \"testmain2.java\");\n\n    assertFalse(originalFile.isFile(), \"original file must not be presented\");\n    assertTrue(resultFile.isFile(), \"preprocessed file must be presented\");\n    String body;\n    try (Reader reader = new FileReader(resultFile)) {\n      body = FileUtils.readFully(reader);\n    }\n    assertFalse(body.contains(\"//#\"));\n    assertFalse(body.contains(\"/*\"));\n    assertTrue(body.contains(\"hellocfg\"));\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-ant/src/test/resources/build.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project name=\"firstbuild\" default=\"preprocess\">\n    <taskdef resource=\"com/igormaznitsa/jcp/ant/tasks.properties\"/>\n\n    <echo>basedir=${basedir}</echo>\n\n    <target name=\"preprocess\">\n        <preprocess\n                target=\"${jcp.target.folder}\"\n                verbose=\"true\"\n                clearTarget=\"true\"\n                keepComments=\"false\"\n                dryRun=\"false\"\n                keepLines=\"true\"\n                careForLastEol=\"true\"\n                allowWhiteSpaces=\"true\"\n                allowBlocks=\"true\"\n                unknownVarAsFalse=\"false\"\n                eol=\"\\r\\n\"\n                sourceEncoding=\"UTF-8\"\n                targetEncoding=\"UTF-8\"\n                preserveIndents=\"true\"\n                dontOverwriteSameContent=\"false\"\n                actionPreprocessorExtensions=\"com.igormaznitsa.jcp.extension.LogPreprocessorExtension\"\n        >\n            <excludeFolders>\n                <folder>**/excluded1</folder>\n                <folder>**/excluded2</folder>\n            </excludeFolders>\n            <excludeExtensions>\n                <extension>cpp</extension>\n                <extension>xml</extension>\n            </excludeExtensions>\n            <extensions>\n                <extension>java</extension>\n            </extensions>\n            <configFiles>\n                <path>./config.cfg</path>\n            </configFiles>\n            <sources>\n                <path>./src</path>\n            </sources>\n            <vars>\n                <var name=\"globalvar\">antdefined</var>\n            </vars>\n        </preprocess>\n    </target>\n\n</project>"
  },
  {
    "path": "jcp-tests/jcp-test-ant/src/test/resources/config.cfg",
    "content": "#some comment\ncfg.test=\"hellocfg\"\n"
  },
  {
    "path": "jcp-tests/jcp-test-ant/src/test/resources/src/com/igormaznitsa/dummyproject/main.java",
    "content": "//   #outname \"testmain2.java\"\npackage com.igormaznitsa.dummyproject;\n\n//#-\npublic class testmain {\n//#+\n//  $$public class testmain2 {\npublic String test(){\n//#action \"hello\",\"world\",$call1(1)\n        return \"/*$ant.ant.project.name+globalvar+cfg.test$*/\";\n    }\n}"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-6/build.gradle",
    "content": "buildscript {\n    repositories {\n        flatDir dirs: \"../../jcp/target\"\n    }\n    dependencies {\n        classpath \"com.igormaznitsa:jcp:$jcp_test_version\"\n    }\n}\n\napply plugin: 'java'\napply plugin: 'application'\napply plugin: 'com.igormaznitsa.jcp'\n\nmainClassName = 'hello.world'\n\nsourceCompatibility = JavaVersion.VERSION_1_8\ntargetCompatibility = JavaVersion.VERSION_1_8\n\nrepositories {\n    mavenLocal()\n    mavenCentral()\n}\n\ndependencies {\n    testCompile 'junit:junit:4.12'\n}\n\njar {\n    manifest {\n        attributes(\n                'Main-Class': 'com.igormaznitsa.jcp.it.gradle.MainTwo'\n        )\n    }\n}\n\n\npreprocess {\n    sources = sourceSets.main.java.srcDirs\n    allowWhitespaces = true\n    eol = '\\r\\n'\n    keepAttributes = true\n    sourceEncoding = 'UTF-8'\n    targetEncoding = 'UTF-8'\n    ignoreMissingSources = false\n    excludeExtensions = ['txt', 'xml']\n    fileExtensions = ['java']\n    unknownVarAsFalse = false\n    dryRun = false\n    verbose = true\n    clearTarget = true\n    careForLastEol = true\n    keepComments = 'keep_all'\n    excludeFolders = ['**/some1', '**/some2']\n    configFiles = ['./configFile.txt']\n    keepLines = true\n    allowWhitespaces = true\n    preserveIndents = true\n    dontOverwriteSameContent = false\n    actionPreprocessorExtensions = [\"com.igormaznitsa.jcp.extension.LogPreprocessorExtension\"]\n    vars = ['some.test.global': 'Some Test Global Value']\n}\ntask(changeSourceFolder) {\n    sourceSets.main.java.srcDirs = [preprocess.target]\n}.dependsOn preprocess\n\n\ncompileJava.dependsOn preprocess\n\ngradle.buildFinished {\n    println(\"Incoming preprocess files: \" + preprocess.incomingFiles.size())\n    println(\"Resulted preprocess files: \" + preprocess.outcomingFiles.size())\n}"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-6/configFile.txt",
    "content": "# config file for build\nsomeGlobalVar=\"HUZZAA!\""
  },
  {
    "path": "jcp-tests/jcp-test-gradle-6/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <parent>\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>jcp-tests</artifactId>\n    <version>0-SNAPSHOT</version>\n  </parent>\n\n  <artifactId>jcp-test-gradle-6</artifactId>\n  <packaging>pom</packaging>\n\n  <dependencies>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>provided</scope>\n    </dependency>\n  </dependencies>\n\n  <build>\n    <plugins>\n      <plugin>\n        <artifactId>maven-clean-plugin</artifactId>\n        <version>3.1.0</version>\n        <configuration>\n          <filesets>\n            <fileset>\n              <directory>${project.basedir}/gradle</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}</directory>\n              <includes>\n                <include>gradlew</include>\n                <include>gradlew.bat</include>\n              </includes>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/downloaded</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/build</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/out</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n          </filesets>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.codehaus.mojo</groupId>\n        <artifactId>exec-maven-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>gradle</id>\n            <phase>compile</phase>\n            <configuration>\n              <executable>${gradle6.executable}</executable>\n              <arguments>\n                <argument>clean</argument>\n                <argument>test</argument>\n                <argument>jar</argument>\n                <argument>--rerun-tasks</argument>\n                <argument>--scan</argument>\n                <argument>--full-stacktrace</argument>\n                <argument>-Pjcp_test_version=${jcp.test.version}</argument>\n                <argument>\n                  -Pjcp_plugin_path=${project.basedir}${file.separator}..${file.separator}..${file.separator}jcp-gradle-plugin${file.separator}build${file.separator}libs${file.separator}jcp-gradle-plugin-${jcp.test.version}.jar\n                </argument>\n              </arguments>\n            </configuration>\n            <goals>\n              <goal>exec</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n    </plugins>\n  </build>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-6/settings.gradle",
    "content": "rootProject.name = 'jcp-test-gradle'"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-6/src/main/java/com/igormaznitsa/jcp/it/gradle/Main.java",
    "content": "// #outname \"MainTwo.java\"\npackage com.igormaznitsa.jcp.it.gradle;\n\n//$public class MainTwo {\n//#//\npublic class Main {\n\n  //$$public MainTwo(){\n  //#//\n  public Main(){\n    if (!this.getClass().getName().endsWith(\"MainTwo\")) {\n      throw new Error(\"Must be MainTwo but detected\"+this.getClass().getName());\n    }\n    //#action \"test\",\"action\",$user3(1,2,3)\n    final String test = /*$\"\\\"\"+some.test.global+someGlobalVar+\"\\\";\"$*/ /*-*/ \"\";\n\n    if (\"Some Test Global ValueHUZZAA!\".equals(test)){\n      System.out.println(\"All ok, detected value '/*$some.test.global+someGlobalVar$*/'\");\n    } else {\n      throw new Error(\"Unexpected value: \"+test);\n    }\n  }\n\n  public String getValue(){\n    return /*$\"\\\"\"+some.test.global+someGlobalVar+\"\\\";\"$*/ /*-*/ \"\";\n  }\n  \n  public static void main(String [] args) {\n    //$$new MainTwo();\n    //#//\n    new Main();\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-6/src/main/java/com/igormaznitsa/jcp/it/gradle/Some.java",
    "content": "package com.igormaznitsa.jcp.it.gradle;\n\npublic class Some {\n\n  public String getText() {\n    return \"Some text\";\n  }\n\n}"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-6/src/test/java/com/igormaznitsa/jcp/it/gradle/TestMain.java",
    "content": "package com.igormaznitsa.jcp.it.gradle;\n\nimport org.junit.Test;\nimport org.junit.Assert;\n\npublic class TestMain {\n\n  @Test\n  public void testMain(){\n      Assert.assertEquals(\"Some Test Global ValueHUZZAA!\", new MainTwo().getValue());\n  }\n\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-7/build.gradle",
    "content": "buildscript {\n    repositories {\n        flatDir dirs: \"../../jcp/target\"\n    }\n    dependencies {\n        classpath \"com.igormaznitsa:jcp:$jcp_test_version\"\n    }\n}\n\napply plugin: 'java'\napply plugin: 'application'\napply plugin: 'com.igormaznitsa.jcp'\n\nmainClassName = 'hello.world'\n\nsourceCompatibility = JavaVersion.VERSION_1_8\ntargetCompatibility = JavaVersion.VERSION_1_8\n\nrepositories {\n    mavenLocal()\n    mavenCentral()\n}\n\ndependencies {\n    testImplementation 'junit:junit:4.12'\n}\n\njar {\n    manifest {\n        attributes(\n                'Main-Class': 'com.igormaznitsa.jcp.it.gradle.MainTwo'\n        )\n    }\n}\n\n\npreprocess {\n    sources = sourceSets.main.java.srcDirs\n    allowWhitespaces = true\n    eol = '\\r\\n'\n    keepAttributes = true\n    sourceEncoding = 'UTF-8'\n    targetEncoding = 'UTF-8'\n    ignoreMissingSources = false\n    excludeExtensions = ['txt', 'xml']\n    fileExtensions = ['java']\n    unknownVarAsFalse = false\n    dryRun = false\n    verbose = true\n    clearTarget = true\n    careForLastEol = true\n    keepComments = 'remove_c_style'\n    excludeFolders = ['**/some1', '**/some2']\n    configFiles = ['./configFile.txt']\n    keepLines = true\n    allowWhitespaces = true\n    preserveIndents = true\n    dontOverwriteSameContent = false\n    actionPreprocessorExtensions = [\"com.igormaznitsa.jcp.extension.LogPreprocessorExtension\"]\n    vars = ['some.test.global': 'Some Test Global Value']\n}\ntask(changeSourceFolder) {\n    sourceSets.main.java.srcDirs = [preprocess.target]\n}.dependsOn preprocess\n\n\ncompileJava.dependsOn preprocess\n\ngradle.buildFinished {\n    println(\"Incoming preprocess files: \" + preprocess.incomingFiles.size())\n    println(\"Resulted preprocess files: \" + preprocess.outcomingFiles.size())\n}"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-7/configFile.txt",
    "content": "# config file for build\nsomeGlobalVar=\"HUZZAA!\""
  },
  {
    "path": "jcp-tests/jcp-test-gradle-7/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <parent>\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>jcp-tests</artifactId>\n    <version>0-SNAPSHOT</version>\n  </parent>\n\n  <artifactId>jcp-test-gradle-7</artifactId>\n  <packaging>pom</packaging>\n\n  <dependencies>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>provided</scope>\n    </dependency>\n  </dependencies>\n\n  <build>\n    <plugins>\n      <plugin>\n        <artifactId>maven-clean-plugin</artifactId>\n        <version>3.1.0</version>\n        <configuration>\n          <filesets>\n            <fileset>\n              <directory>${project.basedir}/gradle</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}</directory>\n              <includes>\n                <include>gradlew</include>\n                <include>gradlew.bat</include>\n              </includes>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/downloaded</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/build</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/out</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n          </filesets>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.codehaus.mojo</groupId>\n        <artifactId>exec-maven-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>gradle</id>\n            <phase>compile</phase>\n            <configuration>\n              <executable>${gradle7.executable}</executable>\n              <arguments>\n                <argument>clean</argument>\n                <argument>test</argument>\n                <argument>jar</argument>\n                <argument>--rerun-tasks</argument>\n                <argument>--scan</argument>\n                <argument>--full-stacktrace</argument>\n                <argument>-Pjcp_test_version=${jcp.test.version}</argument>\n                <argument>\n                  -Pjcp_plugin_path=${project.basedir}${file.separator}..${file.separator}..${file.separator}jcp-gradle-plugin${file.separator}build${file.separator}libs${file.separator}jcp-gradle-plugin-${jcp.test.version}.jar\n                </argument>\n              </arguments>\n            </configuration>\n            <goals>\n              <goal>exec</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n    </plugins>\n  </build>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-7/settings.gradle",
    "content": "rootProject.name = 'jcp-test-gradle'"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-7/src/main/java/com/igormaznitsa/jcp/it/gradle/Main.java",
    "content": "// #outname \"MainTwo.java\"\npackage com.igormaznitsa.jcp.it.gradle;\n\n//$public class MainTwo {\n//#//\npublic class Main {\n\n  //$$public MainTwo(){\n  //#//\n  public Main(){\n    if (!this.getClass().getName().endsWith(\"MainTwo\")) {\n      throw new Error(\"Must be MainTwo but detected\"+this.getClass().getName());\n    }\n    //#action \"hello\",\"world\",$user1(\"test\"+\"one\")\n    final String test = /*$\"\\\"\"+some.test.global+someGlobalVar+\"\\\";\"$*/ /*-*/ \"\";\n\n    if (\"Some Test Global ValueHUZZAA!\".equals(test)){\n      System.out.println(\"All ok, detected value '/*$some.test.global+someGlobalVar$*/'\");\n    } else {\n      throw new Error(\"Unexpected value: \"+test);\n    }\n  }\n\n  public String getValue(){\n    return /*$\"\\\"\"+some.test.global+someGlobalVar+\"\\\";\"$*/ /*-*/ \"\";\n  }\n  \n  public static void main(String [] args) {\n    //$$new MainTwo();\n    //#//\n    new Main();\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-7/src/main/java/com/igormaznitsa/jcp/it/gradle/Some.java",
    "content": "package com.igormaznitsa.jcp.it.gradle;\n\npublic class Some {\n\n  public String getText() {\n    return \"Some text\";\n  }\n\n}"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-7/src/test/java/com/igormaznitsa/jcp/it/gradle/TestMain.java",
    "content": "package com.igormaznitsa.jcp.it.gradle;\n\nimport org.junit.Test;\nimport org.junit.Assert;\n\npublic class TestMain {\n\n  @Test\n  public void testMain(){\n      Assert.assertEquals(\"Some Test Global ValueHUZZAA!\", new MainTwo().getValue());\n  }\n\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-8/build.gradle",
    "content": "buildscript {\n    repositories {\n        flatDir dirs: \"../../jcp/target\"\n    }\n    dependencies {\n        classpath \"com.igormaznitsa:jcp:$jcp_test_version\"\n    }\n}\n\napply plugin: 'java'\napply plugin: 'application'\napply plugin: 'com.igormaznitsa.jcp'\n\nmainClassName = 'hello.world'\n\nsourceCompatibility = JavaVersion.VERSION_1_8\ntargetCompatibility = JavaVersion.VERSION_1_8\n\nrepositories {\n    mavenLocal()\n    mavenCentral()\n}\n\ndependencies {\n    testImplementation 'junit:junit:4.12'\n}\n\njar {\n    manifest {\n        attributes(\n                'Main-Class': 'com.igormaznitsa.jcp.it.gradle.MainTwo'\n        )\n    }\n}\n\n\npreprocess {\n    sources = sourceSets.main.java.srcDirs\n    allowWhitespaces = true\n    eol = '\\r\\n'\n    keepAttributes = true\n    sourceEncoding = 'UTF-8'\n    targetEncoding = 'UTF-8'\n    ignoreMissingSources = false\n    excludeExtensions = ['txt', 'xml']\n    fileExtensions = ['java']\n    unknownVarAsFalse = false\n    dryRun = false\n    verbose = true\n    clearTarget = true\n    careForLastEol = true\n    keepComments = 'remove_jcp_only'\n    excludeFolders = ['**/some1', '**/some2']\n    configFiles = ['./configFile.txt']\n    keepLines = true\n    allowWhitespaces = true\n    preserveIndents = true\n    dontOverwriteSameContent = false\n    actionPreprocessorExtensions = [\"com.igormaznitsa.jcp.extension.LogPreprocessorExtension\"]\n    vars = ['some.test.global': 'Some Test Global Value']\n}\ntask(changeSourceFolder) {\n    sourceSets.main.java.srcDirs = [preprocess.target]\n}.dependsOn preprocess\n\n\ncompileJava.dependsOn preprocess\n\ngradle.buildFinished {\n    println(\"Incoming preprocess files: \" + preprocess.incomingFiles.size())\n    println(\"Resulted preprocess files: \" + preprocess.outcomingFiles.size())\n}"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-8/configFile.txt",
    "content": "# config file for build\nsomeGlobalVar=\"HUZZAA!\""
  },
  {
    "path": "jcp-tests/jcp-test-gradle-8/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <parent>\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>jcp-tests</artifactId>\n    <version>0-SNAPSHOT</version>\n  </parent>\n\n  <artifactId>jcp-test-gradle-8</artifactId>\n  <packaging>pom</packaging>\n\n  <dependencies>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <scope>provided</scope>\n    </dependency>\n  </dependencies>\n\n  <build>\n    <plugins>\n      <plugin>\n        <artifactId>maven-clean-plugin</artifactId>\n        <version>3.1.0</version>\n        <configuration>\n          <filesets>\n            <fileset>\n              <directory>${project.basedir}/gradle</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}</directory>\n              <includes>\n                <include>gradlew</include>\n                <include>gradlew.bat</include>\n              </includes>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/downloaded</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/build</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n            <fileset>\n              <directory>${project.basedir}/out</directory>\n              <followSymlinks>false</followSymlinks>\n            </fileset>\n          </filesets>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.codehaus.mojo</groupId>\n        <artifactId>exec-maven-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>gradle</id>\n            <phase>compile</phase>\n            <configuration>\n              <executable>${gradle8.executable}</executable>\n              <arguments>\n                <argument>clean</argument>\n                <argument>test</argument>\n                <argument>jar</argument>\n                <argument>--rerun-tasks</argument>\n                <argument>--scan</argument>\n                <argument>--full-stacktrace</argument>\n                <argument>-Pjcp_test_version=${jcp.test.version}</argument>\n                <argument>\n                  -Pjcp_plugin_path=${project.basedir}${file.separator}..${file.separator}..${file.separator}jcp-gradle-plugin${file.separator}build${file.separator}libs${file.separator}jcp-gradle-plugin-${jcp.test.version}.jar\n                </argument>\n              </arguments>\n            </configuration>\n            <goals>\n              <goal>exec</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n    </plugins>\n  </build>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-8/settings.gradle",
    "content": "rootProject.name = 'jcp-test-gradle'"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-8/src/main/java/com/igormaznitsa/jcp/it/gradle/Main.java",
    "content": "// #outname \"MainTwo.java\"\npackage com.igormaznitsa.jcp.it.gradle;\n\n//$public class MainTwo {\n//#//\npublic class Main {\n//#action \"hello\",\"world\",$user2(1,2)\n  //$$public MainTwo(){\n  //#//\n  public Main(){\n    if (!this.getClass().getName().endsWith(\"MainTwo\")) {\n      throw new Error(\"Must be MainTwo but detected\"+this.getClass().getName());\n    }\n\n    final String test = /*$\"\\\"\"+some.test.global+someGlobalVar+\"\\\";\"$*/ /*-*/ \"\";\n\n    if (\"Some Test Global ValueHUZZAA!\".equals(test)){\n      System.out.println(\"All ok, detected value '/*$some.test.global+someGlobalVar$*/'\");\n    } else {\n      throw new Error(\"Unexpected value: \"+test);\n    }\n  }\n\n  public String getValue(){\n    return /*$\"\\\"\"+some.test.global+someGlobalVar+\"\\\";\"$*/ /*-*/ \"\";\n  }\n  \n  public static void main(String [] args) {\n    //$$new MainTwo();\n    //#//\n    new Main();\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-8/src/main/java/com/igormaznitsa/jcp/it/gradle/Some.java",
    "content": "package com.igormaznitsa.jcp.it.gradle;\n\npublic class Some {\n\n  public String getText() {\n    return \"Some text\";\n  }\n\n}"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-8/src/test/java/com/igormaznitsa/jcp/it/gradle/TestMain.java",
    "content": "package com.igormaznitsa.jcp.it.gradle;\n\nimport org.junit.Test;\nimport org.junit.Assert;\n\npublic class TestMain {\n\n  @Test\n  public void testMain(){\n      Assert.assertEquals(\"Some Test Global ValueHUZZAA!\", new MainTwo().getValue());\n  }\n\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-9/build.gradle",
    "content": "buildscript {\n    repositories {\n        flatDir dirs: \"../../jcp/target\"\n    }\n    dependencies {\n        classpath \"com.igormaznitsa:jcp:$jcp_test_version\"\n    }\n}\n\napply plugin: 'java'\napply plugin: 'application'\napply plugin: 'com.igormaznitsa.jcp'\n\napplication {\n    mainClass = 'hello.world'\n}\n\njava {\n    sourceCompatibility = JavaVersion.VERSION_1_8\n    targetCompatibility = JavaVersion.VERSION_1_8\n}\n\nrepositories {\n    mavenLocal()\n    mavenCentral()\n}\n\ndependencies {\n    testImplementation 'junit:junit:4.12'\n}\n\njar {\n    manifest {\n        attributes(\n                'Main-Class': 'com.igormaznitsa.jcp.it.gradle.MainTwo'\n        )\n    }\n}\n\n\npreprocess {\n    sources = sourceSets.main.java.srcDirs\n    allowWhitespaces = true\n    eol = '\\r\\n'\n    keepAttributes = true\n    sourceEncoding = 'UTF-8'\n    targetEncoding = 'UTF-8'\n    ignoreMissingSources = false\n    excludeExtensions = ['txt', 'xml']\n    fileExtensions = ['java']\n    unknownVarAsFalse = false\n    dryRun = false\n    verbose = true\n    allowBlocks = true\n    clearTarget = true\n    careForLastEol = true\n    keepComments = 'remove_jcp_only'\n    excludeFolders = ['**/some1', '**/some2']\n    configFiles = ['./configFile.txt']\n    keepLines = true\n    allowWhitespaces = true\n    preserveIndents = true\n    dontOverwriteSameContent = false\n    actionPreprocessorExtensions = [\"com.igormaznitsa.jcp.extension.LogPreprocessorExtension\"]\n    vars = ['some.test.global': 'Some Test Global Value']\n}\ntask(changeSourceFolder) {\n    sourceSets.main.java.srcDirs = [preprocess.target]\n}.dependsOn preprocess\n\n\ncompileJava.dependsOn preprocess\n\ngradle.buildFinished {\n    println(\"Incoming preprocess files: \" + preprocess.incomingFiles.size())\n    println(\"Resulted preprocess files: \" + preprocess.outcomingFiles.size())\n}"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-9/configFile.txt",
    "content": "# config file for build\nsomeGlobalVar=\"HUZZAA!\""
  },
  {
    "path": "jcp-tests/jcp-test-gradle-9/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>com.igormaznitsa</groupId>\n        <artifactId>jcp-tests</artifactId>\n        <version>0-SNAPSHOT</version>\n    </parent>\n\n    <artifactId>jcp-test-gradle-9</artifactId>\n    <packaging>pom</packaging>\n\n    <dependencies>\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <artifactId>maven-clean-plugin</artifactId>\n                <version>3.1.0</version>\n                <configuration>\n                    <filesets>\n                        <fileset>\n                            <directory>${project.basedir}/gradle</directory>\n                            <followSymlinks>false</followSymlinks>\n                        </fileset>\n                        <fileset>\n                            <directory>${project.basedir}</directory>\n                            <includes>\n                                <include>gradlew</include>\n                                <include>gradlew.bat</include>\n                            </includes>\n                            <followSymlinks>false</followSymlinks>\n                        </fileset>\n                        <fileset>\n                            <directory>${project.basedir}/downloaded</directory>\n                            <followSymlinks>false</followSymlinks>\n                        </fileset>\n                        <fileset>\n                            <directory>${project.basedir}/build</directory>\n                            <followSymlinks>false</followSymlinks>\n                        </fileset>\n                        <fileset>\n                            <directory>${project.basedir}/out</directory>\n                            <followSymlinks>false</followSymlinks>\n                        </fileset>\n                    </filesets>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>gradle</id>\n                        <phase>compile</phase>\n                        <configuration>\n                            <executable>${gradle9.executable}</executable>\n                            <arguments>\n                                <argument>clean</argument>\n                                <argument>test</argument>\n                                <argument>jar</argument>\n                                <argument>--rerun-tasks</argument>\n                                <argument>--scan</argument>\n                                <argument>--full-stacktrace</argument>\n                                <argument>-Pjcp_test_version=${jcp.test.version}</argument>\n                                <argument>\n                                    -Pjcp_plugin_path=${project.basedir}${file.separator}..${file.separator}..${file.separator}jcp-gradle-plugin${file.separator}build${file.separator}libs${file.separator}jcp-gradle-plugin-${jcp.test.version}.jar\n                                </argument>\n                            </arguments>\n                        </configuration>\n                        <goals>\n                            <goal>exec</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-9/settings.gradle",
    "content": "rootProject.name = 'jcp-test-gradle'"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-9/src/main/java/com/igormaznitsa/jcp/it/gradle/Main.java",
    "content": "// #outname \"MainTwo.java\"\npackage com.igormaznitsa.jcp.it.gradle;\n\n//$public class MainTwo {\n//#//\npublic class Main {\n//#action \"hello\",\"world\",$user2(1,2)\n  //$$public MainTwo(){\n  //#//\n  public Main(){\n    if (!this.getClass().getName().endsWith(\"MainTwo\")) {\n      throw new Error(\"Must be MainTwo but detected\"+this.getClass().getName());\n    }\n\n    final String test = /*$\"\\\"\"+some.test.global+someGlobalVar+\"\\\";\"$*/ /*-*/ \"\";\n\n    if (\"Some Test Global ValueHUZZAA!\".equals(test)){\n      System.out.println(\"All ok, detected value '/*$some.test.global+someGlobalVar$*/'\");\n    } else {\n      throw new Error(\"Unexpected value: \"+test);\n    }\n  }\n\n  public String getValue(){\n    return /*$\"\\\"\"+some.test.global+someGlobalVar+\"\\\";\"$*/ /*-*/ \"\";\n  }\n  \n  public static void main(String [] args) {\n    //$$new MainTwo();\n    //#//\n    new Main();\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-9/src/main/java/com/igormaznitsa/jcp/it/gradle/Some.java",
    "content": "package com.igormaznitsa.jcp.it.gradle;\n\npublic class Some {\n\n  public String getText() {\n    return \"Some text\";\n  }\n\n}"
  },
  {
    "path": "jcp-tests/jcp-test-gradle-9/src/test/java/com/igormaznitsa/jcp/it/gradle/TestMain.java",
    "content": "package com.igormaznitsa.jcp.it.gradle;\n\nimport org.junit.Test;\nimport org.junit.Assert;\n\npublic class TestMain {\n\n  @Test\n  public void testMain(){\n      Assert.assertEquals(\"Some Test Global ValueHUZZAA!\", new MainTwo().getValue());\n  }\n\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-javassist/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>com.igormaznitsa</groupId>\n        <artifactId>jcp-tests</artifactId>\n        <version>0-SNAPSHOT</version>\n    </parent>\n\n    <artifactId>jcp-test-javassist</artifactId>\n    <packaging>jar</packaging>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.javassist</groupId>\n            <artifactId>javassist</artifactId>\n            <version>3.30.2-GA</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>com.igormaznitsa</groupId>\n                <artifactId>jcp</artifactId>\n                <version>${jcp.test.version}</version>\n                <executions>\n                    <execution>\n                        <id>do-preprocessing</id>\n                        <goals>\n                            <goal>preprocess</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-javassist/src/main/java/com/igormaznitsa/jcp/it/test/JavassistMain.java",
    "content": "package com.igormaznitsa.jcp.it.test;\n\nimport javassist.ClassPool;\nimport javassist.CtClass;\nimport javassist.CtMethod;\nimport javassist.LoaderClassPath;\n\npublic class JavassistMain {\n\n  static {\n    try {\n      final ClassPool cp = ClassPool.getDefault();\n      cp.appendClassPath(new LoaderClassPath(JavassistMain.class.getClassLoader()));\n\n      final CtClass ctClazz = cp.get(JavassistMain.class.getPackage().getName() + \".Main\");\n      final CtMethod printLines = ctClazz.getDeclaredMethod(\"printLines\");\n\n      // source of the method from the Javassistable file will be injected\n      printLines.insertBefore(\n          /*$str2java(evalfile(\"Javassistable.java\"),true)$*//*-*/\"\"\n      );\n      ctClazz.toClass();\n    } catch (Exception ex) {\n      throw new Error(\"Can't make javassist work\", ex);\n    }\n  }\n\n  public boolean printLines(int lineNumber, String pattern, String text) {\n    return new Main().printLines(lineNumber, pattern, text);\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-javassist/src/main/java/com/igormaznitsa/jcp/it/test/Javassistable.java",
    "content": "// this file will be removed by preprocessor from the result because marked as excluded one\n//#excludeif true\n//#-\n\npackage com.igormaznitsa.jcp.it.test;\n\npublic class Javassistable {\n  public boolean printLines(int ___arg1, String ___arg2, String ___arg3) {\n    final int lineCounter = ___arg1;\n    final String pattern = ___arg2;\n    final String text = ___arg3;\n//#+\n    //$int lineCounter = $1;\n    //$String pattern = $2;\n    //$String text = $3;\n\n    if ((lineCounter & 1) != 0) {\n      throw new IllegalArgumentException(\"Line counter must be even one: \" + lineCounter);\n    }\n\n    boolean flag = false;\n    for (int i = 0; i < lineCounter; i++) {\n      System.out.println(String.format(pattern, new String[] {text}));\n      flag = !flag;\n    }\n\n    return flag;\n//#-\n  }\n}\n//#+\n"
  },
  {
    "path": "jcp-tests/jcp-test-javassist/src/main/java/com/igormaznitsa/jcp/it/test/Main.java",
    "content": "package com.igormaznitsa.jcp.it.test;\n\npublic class Main {\n  public boolean printLines(int lineNumber, String pattern, String text) {\n    throw new UnsupportedOperationException(\"Not implemented\");\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-javassist/src/test/java/com/igormaznitsa/jcp/it/test/JavassistableTest.java",
    "content": "package com.igormaznitsa.jcp.it.test;\n\nimport org.junit.jupiter.api.Assertions;\nimport org.junit.jupiter.api.Test;\n\npublic class JavassistableTest {\n\n  @Test\n  public void testProcessJavassistSrc() throws Exception {\n    final JavassistMain main = new JavassistMain();\n    main.printLines(4, \"Feel power of %s!\", \"preprocessing\");\n    Assertions.assertThrows(IllegalArgumentException.class, () ->\n        main.printLines(3, \"Hello %s!\", \"Preprocessor\"));\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-jep238/pom.jdk9.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 \n                             http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <groupId>com.igormaznitsa.examples</groupId>\n  <artifactId>jep-238-jcp-example-java9</artifactId>\n  <version>1.0.0-SNAPSHOT</version>\n  <packaging>jar</packaging>\n\n  <properties>\n    <jdk.version>9</jdk.version>\n    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    <maven.compiler.source>9</maven.compiler.source>\n    <maven.compiler.target>9</maven.compiler.target>\n  </properties>\n\n  <dependencies>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <version>4.12</version>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n\n  <build>\n    <finalName>${main.project.finalName}</finalName>\n    <sourceDirectory>${main.project.src.folder}${file.separator}main${file.separator}java</sourceDirectory>\n    <testSourceDirectory>${main.project.src.folder}${file.separator}test${file.separator}java</testSourceDirectory>\n    <resources>\n      <resource>\n        <directory>${main.project.src.folder}${file.separator}main${file.separator}resources</directory>\n      </resource>\n    </resources>\n    <testResources>\n      <testResource>\n        <directory>${main.project.src.folder}${file.separator}test${file.separator}resources</directory>\n      </testResource>\n    </testResources>\n    <plugins>\n      <!-- disable installation of the module because it is auxiliary one -->\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-install-plugin</artifactId>\n        <version>2.5.2</version>\n        <configuration>\n          <skip>true</skip>\n        </configuration>\n      </plugin>\n\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-jar-plugin</artifactId>\n        <version>3.0.2</version>\n        <configuration>\n          <outputDirectory>${main.project.target}</outputDirectory>\n        </configuration>\n      </plugin>\n\n      <!-- make preprocessing of project sources for choosen JDK version -->\n      <plugin>\n        <groupId>com.igormaznitsa</groupId>\n        <artifactId>jcp</artifactId>\n        <version>${jcp.version}</version>\n        <executions>\n          <!-- make preprocessing of sources -->\n          <execution>\n            <id>preprocess-sources</id>\n            <goals>\n              <goal>preprocess</goal>\n            </goals>\n          </execution>\n          <!-- make preprocessing of test sources -->\n          <execution>\n            <id>preprocess-test-sources</id>\n            <goals>\n              <goal>preprocess</goal>\n            </goals>\n            <configuration>\n              <useTestSources>true</useTestSources>\n            </configuration>\n          </execution>\n        </executions>\n        <configuration>\n          <vars>\n            <jdk.version>${jdk.version}</jdk.version>\n          </vars>\n        </configuration>\n      </plugin>\n\n    </plugins>\n  </build>\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-jep238/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>com.igormaznitsa</groupId>\n        <artifactId>jcp-tests</artifactId>\n        <version>0-SNAPSHOT</version>\n    </parent>\n\n    <artifactId>jcp-test-jep238</artifactId>\n    <packaging>jar</packaging>\n\n    <properties>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <maven.compiler.target>${maven.compiler.source}</maven.compiler.target>\n        <sub.name.jdk9>${project.build.finalName}-jdk9</sub.name.jdk9>\n        <jdk.version>8</jdk.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <version>4.13.2</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <defaultGoal>clean install</defaultGoal>\n\n        <plugins>\n            <!-- it is very important plugin because allows to make internal call to build another maven project with predefined properties, I use it to build version for Java 9 -->\n            <!-- NB! The Plugin is sensitive to Maven home and can not work if you build from IDE with bundled Maven, it there is an error try to use non-bundled one! -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-invoker-plugin</artifactId>\n                <version>3.9.1</version>\n                <executions>\n                    <execution>\n                        <id>make-jdk9-version</id>\n                        <phase>generate-resources</phase>\n                        <goals>\n                            <goal>run</goal>\n                        </goals>\n                        <configuration>\n                            <pom>${basedir}${file.separator}pom.jdk9.xml</pom>\n                            <mergeUserSettings>true</mergeUserSettings>\n                            <profiles></profiles>\n                            <!-- here we just provide some specific properties to executed pom -->\n                            <properties>\n                                <maven.compiler.source>9</maven.compiler.source>\n                                <main.project.src.folder>${project.basedir}/src</main.project.src.folder>\n                                <main.project.target>${project.build.directory}</main.project.target>\n                                <main.project.finalName>${sub.name.jdk9}</main.project.finalName>\n                                <jcp.version>${jcp.test.version}</jcp.version>\n                                <jdk.version>9</jdk.version>\n                            </properties>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n\n            <!-- make preprocessing of project sources for choosen JDK version -->\n            <plugin>\n                <groupId>com.igormaznitsa</groupId>\n                <artifactId>jcp</artifactId>\n                <version>${jcp.test.version}</version>\n                <executions>\n                    <!-- make preprocessing of sources -->\n                    <execution>\n                        <id>preprocess-sources</id>\n                        <goals>\n                            <goal>preprocess</goal>\n                        </goals>\n                    </execution>\n                    <!-- make preprocessing of test sources -->\n                    <execution>\n                        <id>preprocess-test-sources</id>\n                        <goals>\n                            <goal>preprocess</goal>\n                        </goals>\n                        <configuration>\n                            <useTestSources>true</useTestSources>\n                        </configuration>\n                    </execution>\n                </executions>\n                <configuration>\n                    <vars>\n                        <jdk.version>${jdk.version}</jdk.version>\n                    </vars>\n                </configuration>\n            </plugin>\n\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>truezip-maven-plugin</artifactId>\n                <version>1.2</version>\n                <executions>\n                    <execution>\n                        <id>unpack-main-jar</id>\n                        <goals>\n                            <goal>cp</goal>\n                        </goals>\n                        <phase>package</phase>\n                        <configuration>\n                            <from>${project.build.directory}${file.separator}${project.build.finalName}.jar</from>\n                            <to>${project.build.directory}${file.separator}unpacked${file.separator}${project.build.finalName}</to>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>unpack-jdk9-jar</id>\n                        <goals>\n                            <goal>cp</goal>\n                        </goals>\n                        <phase>package</phase>\n                        <configuration>\n                            <from>${project.build.directory}${file.separator}${sub.name.jdk9}.jar</from>\n                            <to>${project.build.directory}${file.separator}unpacked${file.separator}${sub.name.jdk9}</to>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-assembly-plugin</artifactId>\n                <configuration>\n                    <appendAssemblyId>false</appendAssemblyId>\n                    <descriptors>\n                        <descriptor>src${file.separator}assembly${file.separator}assembly.xml</descriptor>\n                    </descriptors>\n                    <archive>\n                        <manifestEntries>\n                            <Multi-Release>true</Multi-Release>\n                            <Main-Class>com.igormaznitsa.tests.Main</Main-Class>\n                        </manifestEntries>\n                    </archive>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>assembly-multi-release-jar</id>\n                        <phase>package</phase>\n                        <goals>\n                            <goal>single</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-clean-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>delete-jdk9-temp-jar</id>\n                        <goals>\n                            <goal>clean</goal>\n                        </goals>\n                        <phase>package</phase>\n                        <configuration>\n                            <excludeDefaultDirectories>true</excludeDefaultDirectories>\n                            <filesets>\n                                <fileset>\n                                    <directory>${project.build.directory}</directory>\n                                    <includes>\n                                        <include>${project.build.finalName}-jdk9.jar</include>\n                                    </includes>\n                                </fileset>\n                            </filesets>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>com.igormaznitsa</groupId>\n                <artifactId>meta-checker</artifactId>\n                <executions>\n                    <execution>\n                        <id>check-multiversion</id>\n                        <goals>\n                            <goal>check-jar</goal>\n                        </goals>\n                        <phase>package</phase>\n                        <configuration>\n                            <restrictClassFormat><![CDATA[<=9]]></restrictClassFormat>\n                            <manifestHas>\n                                <vaue>Multi-Release</vaue>\n                            </manifestHas>\n                            <expected>\n                                <path>META-INF/versions/9/*</path>\n                            </expected>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-jep238/src/assembly/assembly.xml",
    "content": "<assembly xmlns=\"http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3\"\n          xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n          xsi:schemaLocation=\"http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd\">\n  <id>mvjar</id>\n  <formats>\n    <format>jar</format>\n  </formats>\n  <includeBaseDirectory>false</includeBaseDirectory>\n  <fileSets>\n    <fileSet>\n      <directory>${project.build.directory}${file.separator}unpacked${file.separator}${sub.name.jdk9}</directory>\n      <outputDirectory>META-INF${file.separator}versions${file.separator}9</outputDirectory>\n      <!-- we should ignore content of /META-INF for sub module-->\n      <excludes>\n        <exclude>${file.separator}META-INF${file.separator}**</exclude>\n      </excludes>\n    </fileSet>\n    <fileSet>\n      <directory>${project.build.directory}${file.separator}unpacked${file.separator}${project.build.finalName}</directory>\n      <outputDirectory>${file.separator}</outputDirectory>\n      <!-- we can ignore maven folder in the case to make result file smaller -->\n      <excludes>\n        <exclude>${file.separator}META-INF${file.separator}maven${file.separator}**</exclude>\n      </excludes>\n    </fileSet>\n  </fileSets>\n</assembly>\n"
  },
  {
    "path": "jcp-tests/jcp-test-jep238/src/main/java/com/igormaznitsa/tests/JDK9APIClass.java",
    "content": "// the directive below tells preprocessor to exclude the class from module if JDK version is less than 9\n//#excludeif jdk.version<9\npackage com.igormaznitsa.tests;\n\nimport java.util.List;\n\n/**\n * The Class will be presented only for Java 9+.\n */\npublic class JDK9APIClass {\n    public List<String> getList() {\n        // Let use JDK 9 new feature\n        return List.of(\"one\", \"two\", \"three\");\n    }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-jep238/src/main/java/com/igormaznitsa/tests/Main.java",
    "content": "package com.igormaznitsa.tests;\n\n/**\n * Just main class which can be called through command line, nothing special. But it contains APi call which provided since JDK 9.\n */\npublic class Main {\n\n    public static void main(final String... args) {\n        // if you want have only one active piece of code, you can use '//$' which tells to preprocessor to uncoment marked string in preprocessing\n        // and here I have both variants uncommented\n\n        //#if jdk.version>8\n            // we are in section for JDK 9 and great\n            System.out.println(\"Hello New Java \"+Runtime.version().toString()+\" !\");\n        //#else\n            // the section for JDK 8 and earlier ones\n            System.out.println(\"Hello Good Old Java!\");\n        //#endif\n\n        // Just check that class which we want to see only in JDK 9 is provided in scope\n        Class<?> java9Class = null;\n        try {\n            java9Class = Class.forName(\"com.igormaznitsa.tests.JDK9APIClass\");\n        } catch (Exception ex) {\n        }\n        System.out.println(\"Class uses new JDK9 API is \" + (java9Class == null ? \"not in scope\" : \"in scope\"));\n    }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-jep238/src/main/java/com/igormaznitsa/tests/OldJavaClass.java",
    "content": "// the string belows tells to the preprocessor to exclude the file from module variant for JDK 9\n//#excludeif jdk.version>8\npackage com.igormaznitsa.tests;\n\n/**\n * The Class will be presented only for Java which version less than 9.\n */\npublic class OldJavaClass {\n    public String getString(){\n        return \"POJO\";\n    }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-jep238/src/test/java/com/igormaznitsa/tests/JDK9APIClassTest.java",
    "content": "//#excludeif jdk.version<9\npackage com.igormaznitsa.tests;\n\nimport static org.junit.Assert.*;\nimport  org.junit.*;\n\npublic class JDK9APIClassTest {\n    @Test\n    public void testGetList() {\n        Assert.assertArrayEquals(new String[]{\"one\",\"two\",\"three\"},new JDK9APIClass().getList().toArray());\n    }\n}"
  },
  {
    "path": "jcp-tests/jcp-test-jep238/src/test/java/com/igormaznitsa/tests/OldJavaClassTest.java",
    "content": "//#excludeif jdk.version>8\npackage com.igormaznitsa.tests;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\npublic class OldJavaClassTest {\n\n    @Test\n    public void testGetString() {\n        assertEquals(\"POJO\", new OldJavaClass().getString());\n    }\n\n}"
  },
  {
    "path": "jcp-tests/jcp-test-maven/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <parent>\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>jcp-tests</artifactId>\n    <version>0-SNAPSHOT</version>\n  </parent>\n\n  <artifactId>jcp-test-maven</artifactId>\n  <packaging>jar</packaging>\n\n  <properties>\n    <my.custom.property>some_custom_property</my.custom.property>\n  </properties>\n\n  <build>\n    <plugins>\n      <plugin>\n        <groupId>com.igormaznitsa</groupId>\n        <artifactId>jcp</artifactId>\n        <version>${jcp.test.version}</version>\n        <configuration>\n          <eol>\\r\\n</eol>\n        </configuration>\n        <executions>\n          <execution>\n            <id>preprocess-sources</id>\n            <phase>generate-sources</phase>\n            <goals>\n              <goal>preprocess</goal>\n            </goals>\n            <configuration>\n              <allowWhitespaces>true</allowWhitespaces>\n              <eol>\\r\\n</eol>\n              <excludeExtensions>\n                <extension>xml</extension>\n                <extension>txt</extension>\n              </excludeExtensions>\n              <extensions>\n                <extension>java</extension>\n              </extensions>\n              <keepAttributes>true</keepAttributes>\n              <keepComments>false</keepComments>\n              <keepLines>true</keepLines>\n              <vars>\n                <some.test.global>Some Test Global Value</some.test.global>\n              </vars>\n              <actionPreprocessorExtensions>\n                  <actionPreprocessorExtension>com.igormaznitsa.jcp.extension.LogPreprocessorExtension</actionPreprocessorExtension>\n              </actionPreprocessorExtensions>\n              <sourceEncoding>UTF-8</sourceEncoding>\n              <targetEncoding>UTF-8</targetEncoding>\n              <ignoreMissingSources>false</ignoreMissingSources>\n              <unknownVarAsFalse>true</unknownVarAsFalse>\n              <dryRun>false</dryRun>\n                <allowBlocks>true</allowBlocks>\n              <verbose>true</verbose>\n              <clearTarget>true</clearTarget>\n              <replaceSources>true</replaceSources>\n              <careForLastEol>true</careForLastEol>\n              <excludeFolders>\n                <folder>./some1</folder>\n                <folder>./**/some2</folder>\n              </excludeFolders>\n              <preserveIndents>true</preserveIndents>\n              <dontOverwriteSameContent>false</dontOverwriteSameContent>\n              <skip>false</skip>\n            </configuration>\n          </execution>\n          <execution>\n            <id>preprocess-test-sources</id>\n            <phase>generate-test-sources</phase>\n            <goals>\n              <goal>preprocess</goal>\n            </goals>\n            <configuration>\n              <useTestSources>true</useTestSources>\n              <unknownVarAsFalse>true</unknownVarAsFalse>\n              <vars>\n                <empty.null.variable></empty.null.variable>\n                <some.test.global.test>Some Test</some.test.global.test>\n              </vars>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.codehaus.mojo</groupId>\n        <artifactId>build-helper-maven-plugin</artifactId>\n        <version>3.0.0</version>\n        <executions>\n          <execution>\n            <id>set-test-property</id>\n            <goals>\n              <goal>bsh-property</goal>\n            </goals>\n            <phase>process-classes</phase>\n            <configuration>\n              <source>\n                session.getUserProperties().setProperty(\"my.custom.property\",\"test_custom_property\");\n              </source>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n    </plugins>\n  </build>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-maven/src/main/java/com/igormaznitsa/jcp/it/maven/Main.java",
    "content": "// #outname \"MainTwo.java\"\npackage com.igormaznitsa.jcp.it.maven;\n\n//$public class MainTwo {\n//#//\n//#action 1,2,3\npublic class Main {\n\n  //$$public MainTwo(){\n  //#//\n  public Main(){\n    if (!this.getClass().getName().endsWith(\"MainTwo\")) {\n      throw new Error(\"Must be MainTwo but detected\"+this.getClass().getName());\n    }\n\n    //#if empty.null.variable\n    throw new Error(\"Must not be presented because variable must be recognized as false\");\n    //#endif\n\n    final String test = /*$\"\\\"\"+some.test.global+\"\\\";\"$*/ /*-*/ \"\";\n\n    if (\"Some Test Global Value\".equals(test)){\n      System.out.println(\"All ok\");\n    } else {\n      throw new Error(\"Unexpected value: \"+test);\n    }\n  }\n\n  //#action $hello1(\"getProperty\")\n  public String getProperty() {\n    return \"/*$mvn.project.property.my.custom.property$*/\";\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-maven/src/test/java/com/igormaznitsa/jcp/it/maven/TestMain.java",
    "content": "package com.igormaznitsa.jcp.it.maven;\n\nimport org.junit.jupiter.api.Test;\n\nimport static org.junit.jupiter.api.Assertions.*;\n\nclass TestMain {\n\n  @Test\n  void testMain(){\n      //$MainTwo obj = new MainTwo();\n      //#-\n      Main obj = new Main();\n      //#+\n\n      assertEquals(\"some_custom_property\", obj.getProperty());\n      assertEquals(\"test_custom_property\",\"/*$mvn.project.property.my.custom.property$*/\");\n\n      String str = /*$\"\\\"\"+some.test.global.test+\"\\\";\"$*/ /*-*/\"\";\n      assertEquals(\"Some Test\", str);\n      System.out.println(str);\n  }\n\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-maven-action/jcp-test-maven-action-action/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <parent>\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>jcp-test-maven-action</artifactId>\n    <version>0-SNAPSHOT</version>\n  </parent>\n\n  <artifactId>jcp-test-maven-action-action</artifactId>\n  <packaging>jar</packaging>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-maven-action/jcp-test-maven-action-action/src/main/java/com/igormaznitsa/jcp/it/CustomPreprocessorExtension.java",
    "content": "package com.igormaznitsa.jcp.it;\n\nimport com.igormaznitsa.jcp.context.PreprocessorContext;\nimport com.igormaznitsa.jcp.expression.Value;\nimport com.igormaznitsa.jcp.extension.PreprocessorExtension;\nimport java.util.Arrays;\nimport java.util.Set;\nimport java.util.List;\n\npublic class CustomPreprocessorExtension implements PreprocessorExtension {\n\n  private static final Set<Integer> ARITY = Set.of(1);\n\n  @Override\n  public boolean hasAction(int arity) {\n    return true;\n  }\n\n  @Override\n  public boolean hasUserFunction(String name, Set<Integer> arity) {\n    if (\"hellofunc\".equals(name)) {\n      return arity.isEmpty() || arity.contains(1);\n    }\n    return false;\n  }\n\n  @Override\n  public boolean processAction(PreprocessorContext context, List<Value> parameters) {\n    System.out.println(\"Called action for parameters: \" + parameters);\n    return true;\n  }\n\n  @Override\n  public Set<Integer> getUserFunctionArity(String functionName) {\n    if (functionName.equals(\"hellofunc\")) {\n      return ARITY;\n    } else {\n      throw new IllegalArgumentException(\"Unexpected user function: \" + functionName);\n    }\n  }\n\n  @Override\n  public Value processUserFunction(\n      PreprocessorContext context,\n      String functionName,\n      List<Value> arguments) {\n    if (functionName.equals(\"hellofunc\")) {\n      return Value.valueOf(\"Hello \" + arguments.get(0).toString() + \"!\");\n    } else {\n      throw new IllegalArgumentException(\"Unexpected user function call: \" + functionName);\n    }\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-maven-action/jcp-test-maven-action-plugin-call/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n\n  <parent>\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>jcp-test-maven-action</artifactId>\n    <version>0-SNAPSHOT</version>\n  </parent>\n\n  <artifactId>jcp-test-maven-action-plugin-call</artifactId>\n  <packaging>jar</packaging>\n\n  <build>\n    <plugins>\n      <plugin>\n        <groupId>com.igormaznitsa</groupId>\n        <artifactId>jcp</artifactId>\n        <version>${jcp.test.version}</version>\n        <configuration>\n          <eol>\\r\\n</eol>\n        </configuration>\n        <executions>\n          <execution>\n            <id>preprocess-sources</id>\n            <phase>generate-sources</phase>\n            <goals>\n              <goal>preprocess</goal>\n            </goals>\n            <configuration>\n              <allowWhitespaces>true</allowWhitespaces>\n              <eol>\\r\\n</eol>\n              <extensions>\n                <extension>java</extension>\n              </extensions>\n              <keepAttributes>true</keepAttributes>\n              <keepComments>true</keepComments>\n              <keepLines>true</keepLines>\n                <actionPreprocessorExtensions>\n                    <actionPreprocessorExtension>com.igormaznitsa.jcp.it.CustomPreprocessorExtension</actionPreprocessorExtension>\n                </actionPreprocessorExtensions>\n              <sourceEncoding>UTF-8</sourceEncoding>\n              <targetEncoding>UTF-8</targetEncoding>\n            </configuration>\n          </execution>\n        </executions>\n        <dependencies>\n          <dependency>\n            <groupId>com.igormaznitsa</groupId>\n            <artifactId>jcp-test-maven-action-action</artifactId>\n            <version>${project.version}</version>\n          </dependency>\n        </dependencies>\n      </plugin>\n    </plugins>\n  </build>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-maven-action/jcp-test-maven-action-plugin-call/src/main/java/com/igormaznitsa/jcp/it/Main.java",
    "content": "package com.igormaznitsa.jcp.it;\n\npublic class Main {\n\n  public static void main(String ... args) {\n    //#action \"Huzzaa\"\n    System.out.println(\"Started\");\n  }\n\n  public static String makeHello() {\n    return /*$\"\\\"\"+$hellofunc(\"jcp\")+\"\\\";\"$*/ /*-*/ \"\";\n  }\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-maven-action/jcp-test-maven-action-plugin-call/src/test/java/com/igormaznitsa/jcp/it/MainTest.java",
    "content": "package com.igormaznitsa.jcp.it;\n\nimport org.junit.jupiter.api.Assertions;\nimport org.junit.jupiter.api.Test;\n\nclass MainTest {\n  @Test\n  void testMain() {\n    Assertions.assertEquals(\"Hello jcp!\", Main.makeHello());\n  }\n}"
  },
  {
    "path": "jcp-tests/jcp-test-maven-action/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>com.igormaznitsa</groupId>\n        <artifactId>jcp-tests</artifactId>\n        <version>0-SNAPSHOT</version>\n    </parent>\n\n    <artifactId>jcp-test-maven-action</artifactId>\n    <packaging>pom</packaging>\n\n    <modules>\n        <module>jcp-test-maven-action-action</module>\n        <module>jcp-test-maven-action-plugin-call</module>\n    </modules>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>com.igormaznitsa</groupId>\n        <artifactId>jcp-tests</artifactId>\n        <version>0-SNAPSHOT</version>\n    </parent>\n\n    <artifactId>jcp-test-static-site</artifactId>\n    <packaging>jar</packaging>\n\n    <dependencies>\n        <dependency>\n            <groupId>commons-io</groupId>\n            <artifactId>commons-io</artifactId>\n            <version>2.19.0</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <configuration>\n                    <systemPropertyVariables>\n                        <jcp.target.folder>${project.build.directory}${file.separator}gensite</jcp.target.folder>\n                    </systemPropertyVariables>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>com.igormaznitsa</groupId>\n                <artifactId>jcp</artifactId>\n                <version>${jcp.test.version}</version>\n                <executions>\n                    <execution>\n                        <id>preprocess-gen-static-site</id>\n                        <phase>generate-resources</phase>\n                        <goals>\n                            <goal>preprocess</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                               <folder>${basedir}${file.separator}src${file.separator}main${file.separator}resources</folder>\n                            </sources>\n                            <target>${project.build.directory}${file.separator}gensite</target>\n                            <keepLines>false</keepLines>\n                            <eol>\\r\\n</eol>\n                            <excludedExtensions>\n                                <extension>xml</extension>\n                            </excludedExtensions>\n                            <sourceEncoding>CP1251</sourceEncoding>\n                            <targetEncoding>CP1251</targetEncoding>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/about.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body>\n//#+\n//#if curLangID==\"rus\"\n<div align=\"justify\" class=\"alltext\">\n&nbsp;&nbsp; ColdCore -     Java2ME        ,         .        .    ,            ,   100      .   -           Java2ME     ,  -   ,    .<br>        ,        : \n<ul>\n<li>       .</li>\n<li>     .</li>\n</ul>\n</div>\n//#else\n<div align=\"justify\" class=\"alltext\">\n&nbsp;&nbsp;ColdCore is a leader in Java2ME content development. We have unique skills and technologies that enable us to develop hi-end production under time. Our production is published under leading worldwide trademarks and our portfolio contains more than 100 games and applications for mobile devices. Our mission is to become a global leader in mobile Java2ME game content development through development the best technologies, the best workflows and the best products that meet requirements of the market.<br>We not only develop mobile applications for own sales but also we implement outside orders like:\n<ul>\n<li>Development of mobile games and mobile applications to order.</li>\n<li>Development of parts for customer's systems.</li>\n</ul>\n</div>\n//#endif\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/channels.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<channels>\n\t<channel id=\"SIMONE\">\n        <name>\n           <lang id=\"rus\">&#1057;&#1048;&#1052;&#1054;&#1053;&#1040;</lang>\n\t\t   <lang id=\"eng\">SIMONE</lang>\n        </name>\n\t\t<reference>\n\t\t   <lang id=\"rus\">&#1050;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;</lang>\n\t\t   <lang id=\"eng\">A content provider</lang>\n\t\t</reference>\n        <link>\n\t\t   <lang id=\"rus\">http://www.simona.ru</lang>\n\t\t   <lang id=\"eng\">http://www.simona.ru</lang>\n\t\t</link>\n\t</channel>\n</channels>"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/cmn/sendfeedback.phtml",
    "content": "<?\n$fText=\"$fTitle\\n\\n\";\n$fText.=date(\"l dS of F Y h:i:s A\").\"\\n\\n\";\n\n$fText.=\"Name: $fName\\n\";\n$fText.=\"Email: $fEmail\\n\\n\";\n\n$fText.=$fComment;\n$fText.=\"\\n\\n\";\n\nif (mail(\"feedback@coldcore.ru\",$fSubject,$fText)) {Header(\"Location: $fOk\");}\nelse {Header(\"Location: $fBad\");}\nexit;\n?>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/cmn/styles.css",
    "content": "body {\n\tmargin-left: 0px;\n\tmargin-top: 0px;\n\tmargin-right: 0px;\n\tmargin-bottom: 0px;\n\tbackground-color: #FFFFFF;\n}\n.menuheader {\nFONT-WEIGHT: normal;\n FONT-SIZE: 14px;\n  COLOR: #BFBFFF;\n   FONT-FAMILY: \"Small Fonts\", \"Arial Black\", Arial, Helvetica, sans-serif}\n.menu {\n\tFONT-WEIGHT: bold;\n\tFONT-SIZE: 11px;\n\tCOLOR: white;\n\tFONT-FAMILY: Arial, Helvetica, sans-serif;\n\tTEXT-DECORATION: none;\n}\n.alltext {\n\tFONT-WEIGHT: normal;\n\tFONT-FAMILY: \"Times New Roman\", Times, serif;\n\tCOLOR: black;\n\tTEXT-DECORATION: none;\n\tfont-size: 12px;\n\tfont-style: normal;\n}\n.newdata {\nFONT-WEIGHT: bold;\n FONT-SIZE: 11px;\n  COLOR: #000000;\n   FONT-FAMILY: Arial, Helvetica, sans-serif}\n\n.footer {\n\tfont-size: x-small;\n\tfont-family: Arial, Helvetica, sans-serif;\n\tcolor: #999999;\n\n}\n.langtxt {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 11px;\n\tfont-style: normal;\n\tfont-weight: bold;\n}\n\n.rightnews {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 9px;\n}\n.rightnewsHdr {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n}\n\na:link {\n\ttext-decoration: none;\n\tcolor: #00BBFF;\n}\na:visited {\n\ttext-decoration: none;\n\tcolor: #00BBFF;\n}\na:hover {\n\ttext-decoration: none;\n\tcolor: #00FF00;\n}\na:active {\n\ttext-decoration: none;\n\tcolor: #00BBFF;\n}\n.catalogheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 16px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheadermin {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/cmn/styles2.css",
    "content": "body {\n\tmargin-left: 0px;\n\tmargin-top: 0px;\n\tmargin-right: 0px;\n\tmargin-bottom: 0px;\n\tbackground-color: #FFFFFF;\n}\n.menuheader {\nFONT-WEIGHT: normal;\n FONT-SIZE: 14px;\n  COLOR: #BFBFFF;\n   FONT-FAMILY: \"Small Fonts\", \"Arial Black\", Arial, Helvetica, sans-serif}\n.menu {\n\tFONT-WEIGHT: bold;\n\tFONT-SIZE: 11px;\n\tCOLOR: white;\n\tFONT-FAMILY: Arial, Helvetica, sans-serif;\n\tTEXT-DECORATION: none;\n}\n.alltext {\n\tFONT-WEIGHT: normal;\n\tFONT-FAMILY: \"Times New Roman\", Times, serif;\n\tCOLOR: black;\n\tTEXT-DECORATION: none;\n\tfont-size: 12px;\n\tfont-style: normal;\n}\n.newdata {\nFONT-WEIGHT: bold;\n FONT-SIZE: 11px;\n  COLOR: #000000;\n   FONT-FAMILY: Arial, Helvetica, sans-serif}\n\n.footer {\n\tfont-size: x-small;\n\tfont-family: Arial, Helvetica, sans-serif;\n\tcolor: #999999;\n\n}\n.langtxt {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 11px;\n\tfont-style: normal;\n\tfont-weight: bold;\n}\n\n.rightnews {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 9px;\n}\n.rightnewsHdr {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n}\n\na:link {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\na:visited {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\na:hover {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\na:active {\n\ttext-decoration: none;\n\tcolor: #000000;\n}\n.catalogheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheader {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 16px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.gameinfoheadermin {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.devicename {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.devicelist {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 10px;\n\tfont-weight: normal;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.sendformref {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.sendformhdr {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n.sendformtxt {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: normal;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n\n.sendformfield {\n\tfont-family: Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tcolor: #000066;\n\ttext-decoration: none;\n}\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/contacts.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body>\n//#+\n<div align=\"left\" class=\"alltext\">\n<br>\n//#if curLangID==\"rus\"\n  : <a href=mailto:support@coldcore.ru>support@coldcore.ru</a><br>\n  : <a href=mailto:webmaster@coldcore.ru>webmaster@coldcore.ru</a><br>\n  : <a href=mailto:sales@coldcore.ru>sales@coldcore.ru</a><br>\n//#else\nInformation: <a href=mailto:support@coldcore.ru>support@coldcore.ru</a><br>\nWebsite: <a href=mailto:webmaster@coldcore.ru>webmaster@coldcore.ru</a><br>\nMarketing: <a href=mailto:sales@coldcore.ru>sales@coldcore.ru</a><br>\n//#endif\n</div>\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/devices.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<devices>\n\t<nokia name=\"Nokia\">\n      <series30bw>3410</series30bw>\n      <series30c>3510i</series30c>\n\t  <series40dp1>7210, 3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, 6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i</series40dp1>\n      <series40dp2>6230, 5140, 5140, 6170, 6255, 6020, 7260, 7270</series40dp2>\n      <series40dp2b>6230i, 8800</series40dp2b>\n      <series60dp1>3650, 3600, 3620, 3660, 7650, N-Gage, N-GageQD</series60dp1>\n      <series60dp2a>6600, 6620</series60dp2a>\n      <series60dp2b>7610, 6260, 6670, 3230</series60dp2b>\n      <series60dp2c>6630</series60dp2c>\n\t</nokia>\n\t<siemens name=\"Siemens\">\n\t\t<series45a>M(T)50, C55, C56, CT56, 6688i, M46, 3118</series45a>\n\t\t<series45b>SL45i</series45b>\n        <series55a>M55, C60, MC60</series55a>\n        <series55b>S55, SL55</series55b>\n        <series65a>S65, CX65, CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65</series65a>\n        <series65b>C65, SL65</series65b>\n\t</siemens>\n\t<motorola name=\"Motorola\">\n\t\t<seriesC380>C380, C650, v220, v180</seriesC380>\n        <seriesA008>Accompli 008</seriesA008>\n        <seriesE398>v300, v500, v600, v535, v550, v620, E398, E375, v3</seriesE398>\n\t</motorola>\n    <samsung name=\"Samsung\">\n\t\t<group1>D108, S100, S105, X400, X426, X427, X430</group1>\n\t\t<group2>E400, S200, S208</group2>\n\t\t<group3>C100, C108T, C110, S300, S300M, S307</group3>\n\t\t<group4>E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, E820, X460, X468</group4>\n\t\t<group5>X100, X108, X600, X608</group5>\n\t\t<group6a>E105, E315, E316, E317, E710, E715, P400, P510, P518, X427M, X450, X458, X475</group6a>\n\t\t<group6b>E217, E335, E635, X640</group6b>\n\t\t<group7>C200, C207, C208, C225, E600, E608, X105</group7>\n\t\t<group8>D410, D415, D418, P207, P777</group8>\n\t\t<group9>E300, E310, E810, X480</group9>\n\t\t<group10>X120, X140</group10>\n\t\t<group11>E610, E618, P730, P735</group11>\n\t\t<group12a>D500, D508, E730</group12a>\n\t\t<group12b>E530, E620, E720, E880</group12b>\n\t\t<group12c>D600</group12c>\n\t\t<group13>Z105, Z107</group13>\n\t\t<group14>Z110</group14>\n\t\t<group15a>Z130</group15a>\n\t\t<group15b>Z140, Z300, Z500</group15b>\n\t</samsung>\n    <lg name=\"LG\">\n\t\t<seriesG1600>G1600</seriesG1600>\n\t</lg>\n    <se name=\"SonyEricsson\">\n\t\t<series610>T610, T616, T618, T628, T630, T637, Z600, Z608</series610>\n\t</se>\n</devices>"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/eng/send_error.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>I can't deliver the message.</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#FF9393\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../x_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>I can't deliver the message. May be the server has troubles, if it is possible resend the message later. Thank you.</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/eng/send_ok.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Your message has been delivered successfully.</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#C4CFFF\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../i_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>Your message has been delivered successfully. Thank you very much!</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/gamelist.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n<body>\n//#+\n<br>\n//#local gl_curGameIndex = 0\n//#local gl_counterOutGames = 0\n//#while gl_curGameIndex<xml_size(games_list)\n//#local gl_currentGameElement = xml_get(games_list,gl_curGameIndex)\n//#if xml_size(xml_list(gl_currentGameElement,currentItemID))>0\n//#local gl_gameID = xml_attr(gl_currentGameElement,\"id\")\n//#local gl_gamePageLink = \"gpage_\"+gl_gameID+\".htm\"\n//#local gl_gameReference = xml_get(xml_list(gl_currentGameElement,\"shortreference\"),0)\n//#local gl_gameReferenceName = str2web(xml_attr(gl_currentGameElement,\"title\"))\n//#local gl_gameReferenceText = xml_text(xml_get(xml_list(gl_gameReference,curLangID),0))\n//#if gl_counterOutGames!=0\n<hr align=\"center\" noshade>\n//#endif\n//#local gl_counterOutGames = gl_counterOutGames + 1\n<table width=\"100%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n  <tr>\n  \t<td colspan=\"2\">\n  \t<div align=\"left\" class=\"catalogheader\">\n  \t/*$gl_gameReferenceName$*/\n  \t</div>\n  \t<br>\n  \t</td>\n  </tr>\t\n  <tr>\n    <td width=\"128\" align=\"left\" valign=\"top\">\n    <div align=\"left\">\n    <a href=\"/*$gl_gamePageLink$*/\" target=\"_new\">\n    <img src=\"/*$\"../games/\"+gl_gameID+\"_splash.jpg\"$*/\" border=\"0\">\n    </a>\n    </div>\n    </td>\n    <td align=\"left\" valign=\"top\">\n    <div align=\"justify\" class=\"alltext\">\n    /*$gl_gameReferenceText$*/\n\t<br>\n\t//#if curLangID==\"rus\"\n\t\t<span class=\"rightnewsHdr\"><a href=\"/*$gl_gamePageLink$*/\" target=\"_new\"> ...</a></div></td>\n\t//#else\n\t\t<span class=\"rightnewsHdr\"><a href=\"/*$gl_gamePageLink$*/\" target=\"_new\">read more...</a></div></td>\n\t//#endif\n    </div>\n    </td>\n  </tr>\n</table>\n<br>\n//#endif\n//#local gl_curGameIndex = gl_curGameIndex + 1\n//#end\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/gameref.htm",
    "content": "//#local gref_langs = xml_root(xml_open(\"site.xml\"))\n//#local gref_devices = xml_root(xml_open(\"devices.xml\"))\n//#local gref_footer = xml_get(xml_list(xml_root(xml_open(\"site.xml\")),\"footer\"),0)\n//#local gref_langs = xml_list(xml_get(xml_list(gref_langs,\"languages\"),0),\"lang\")\n\n//#local gref_docRoot = xml_root(xml_open(\"games.xml\"))\n//#local gref_gamesList = xml_list(xml_get(xml_list(gref_docRoot,\"games\"),0),\"game\")\n//#local gref_channelsList = xml_get(xml_list(gref_docRoot,\"channels\"),0)\n//#local gref_ownersList = xml_get(xml_list(gref_docRoot,\"owners\"),0)\n\n//#local gref_langIndex = 0\n//#while gref_langIndex<xml_size(gref_langs)\n//#local gref_curLangID = xml_attr(xml_get(gref_langs,gref_langIndex),\"id\") \n//#local gref_curLangFooter = xml_text(xml_get(xml_list(gref_footer,gref_curLangID),0))\n\n//#outdir gref_curLangID\n\n//#local gref_curGameIndex = 0\n//#while gref_curGameIndex<xml_size(gref_gamesList)\n\n//#local gref_currentGameElement = xml_get(gref_gamesList,gref_curGameIndex)\n//#local gref_currentGameScreens = xml_attr(gref_currentGameElement,\"screens\")\n//#local gref_currentGameID = xml_attr(gref_currentGameElement,\"id\")\n//#local gref_currentGameTitle = xml_attr(gref_currentGameElement,\"title\")\n//#local gref_currentGameYear = xml_attr(gref_currentGameElement,\"year\")\n\n//#local gref_currentGameDevices = xml_list(xml_get(xml_list(gref_currentGameElement,\"devices\"),0),\"*\")\n\n//#local gref_currentGameReference =xml_text(xml_get(xml_list(xml_get(xml_list(gref_currentGameElement,\"reference\"),0),gref_curLangID),0))\n\n//#local gref_currentOwnerElement = xml_get(xml_list(gref_ownersList,xml_attr(xml_get(xml_list(gref_currentGameElement,\"owner\"),0),\"id\")),0)\n//#local gref_currentSalesList = xml_list(xml_get(xml_list(gref_currentGameElement,\"sales\"),0),\"*\")\n\n//#local gref_pageName = \"gpage_\"+gref_currentGameID+\".htm\"\n//#outname gref_pageName\n//#echo Making game reference file /*$gref_pageName$*/\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>ColdCore(TM)//*$gref_currentGameTitle$*/</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles2.css\" type=text/css rel=stylesheet>\n</head>\n\n<body>\n<table width=\"100%%\"  border=\"0\" cellpadding=\"3\" cellspacing=\"0\" bgcolor=\"#CACAFF\">\n  <tr>\n    <td width=\"120\" align=\"center\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#5BB5F7\">\n      <tr>\n        <td height=\"160\"><div align=\"center\"><img src=\"/*$\"../games/\"+gref_currentGameID+\"_splash.jpg\"$*/\"><br>\n        </div></td>\n      </tr>\n      <tr>\n        <td align=\"left\" valign=\"top\">\n//#if gref_curLangID==\"rus\"\n        <div class=\"gameinfoheadermin\">&#1042;&#1051;&#1040;&#1044;&#1045;&#1051;&#1045;&#1062;:</div>\n//#else\n        <div class=\"gameinfoheadermin\">OWNER:</div>\n//#endif\n        <div><a href=\"/*$xml_attr(gref_currentOwnerElement,\"link\")$*/\" target=\"_new\" class=\"gameinfoheadermin\">/*$str2web(xml_text(gref_currentOwnerElement))$*/</a></div>\n         <br>\n//#if gref_curLangID==\"rus\"\n         <div class=\"gameinfoheadermin\">&#1043;&#1054;&#1044;&nbsp;&#1042;&#1067;&#1055;&#1059;&#1057;&#1050;&#1040;:</div>\n//#else\n         <div class=\"gameinfoheadermin\">PUBLICATION&nbsp;DATE:</div>\n//#endif\n         <div><strong>/*$gref_currentGameYear$*/</strong></div>\n        <BR></td>\n      </tr>\n      <tr>\n        <td align=\"left\">\n\n//#if gref_curLangID==\"rus\"\n        <strong class=\"gameinfoheadermin\">&#1059;&#1057;&#1058;&#1056;&#1054;&#1049;&#1057;&#1058;&#1042;&#1040;:</strong>\n//#else\n        <strong class=\"gameinfoheadermin\">DEVICES:</strong>\n//#endif\n        <hr align=\"center\" noshade>\n\n//#local gref_curDeviceIndex = 0\n//#local gref_curDeviceName = \"\"\n//#while gref_curDeviceIndex<xml_size(gref_currentGameDevices)\n//#local gref_curDeviceElement = xml_get(gref_currentGameDevices,gref_curDeviceIndex)\n//#local gref_curDeviceElementName = xml_name(gref_curDeviceElement)\n//#local gref_curDeviceFamily = xml_attr(gref_curDeviceElement,\"family\")\n//#local gref_curDeviceElementName = xml_get(xml_list(gref_devices,gref_curDeviceElementName),0)\n//#local gref_curDeviceFamily = xml_text(xml_get(xml_list(gref_curDeviceElementName,gref_curDeviceFamily),0))\n//#local gref_curDeviceElementName = xml_attr(gref_curDeviceElementName,\"name\")\n//#if gref_curDeviceElementName!=gref_curDeviceName\n//#local gref_curDeviceName = gref_curDeviceElementName\n//#if gref_curDeviceIndex!=0\n<br>\n//#endif\n<div class=\"devicename\">/*$str2web(gref_curDeviceName)$*/</div>\n//#endif          \n<div class=\"devicelist\">/*$gref_curDeviceFamily$*/</div>\n//#local gref_curDeviceIndex = gref_curDeviceIndex+1    \n//#end          \n   </td></tr>\n    </table>\n    <br>\n    </td>\n    <td align=\"left\" valign=\"top\"><div align=\"center\" class=\"gameinfoheader\">/*$gref_currentGameTitle$*/<hr align=\"center\" width=\"50%\" noshade>\n      </div>\n      <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n      <tr>\n//#if strlen(gref_currentGameScreens)>0\n//#local gref_curScreenLimit = str2int(gref_currentGameScreens)\n//#else\n//#local gref_curScreenLimit = 3\n//#endif\n\n//#local gref_curScreenIndex = 1\n//#while gref_curScreenIndex<=gref_curScreenLimit \n        <td align=\"center\" valign=\"middle\"><div align=\"center\"><img src=\"/*$\"../games/\"+gref_currentGameID+\"_scr\"+gref_curScreenIndex+\".gif\"$*/\"></div></td>\n//#local gref_curScreenIndex = gref_curScreenIndex+1\n//#end\n      </tr>\n    </table>    \n    <div class=\"alltext\" align=\"justify\"><br>/*$gref_currentGameReference$*/</div>\n\n<hr>\n\n<form method=\"post\" action=\"../cmn/sendfeedback.phtml\">\n  <table width=100% cellpadding=4 bgcolor=\"#C1E1F0\" >\n    <tr>\n<td bgcolor=\"#E6EEF7\"> <div class=\"sendformref\">\n//#if gref_curLangID==\"rus\"\n&#1055;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1101;&#1090;&#1086;&#1081; &#1092;&#1086;&#1088;&#1084;&#1099;, &#1042;&#1099; &#1084;&#1086;&#1078;&#1077;&#1090;&#1077; &#1087;&#1086;&#1089;&#1083;&#1072;&#1090;&#1100; &#1085;&#1072;&#1084; &#1089;&#1074;&#1086;&#1077; &#1084;&#1085;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1086;&#1078;&#1077;&#1083;&#1072;&#1085;&#1080;&#1077; &#1080;&#1083;&#1080; &#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077; &#1087;&#1088;&#1086;&#1073;&#1083;&#1077;&#1084;&#1099; &#1087;&#1086; &#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1102;. &#1069;&#1090;&#1086; &#1086;&#1095;&#1077;&#1085;&#1100; &#1074;&#1072;&#1078;&#1085;&#1086; &#1076;&#1083;&#1103; &#1085;&#1072;&#1089;!\n//#else\nThe form enables you to send us your opinion, wish or problem description for the application. It's very important for us!\n//#endif\n</div>\n        </td>\n    </tr>\n    <tr> \n      <td width=100% valign=top>\n<div class=\"sendformhdr\">\n//#if gref_curLangID==\"rus\"\n&#1048;&#1084;&#1103;:\n//#else\nName:\n//#endif\n</div>\n      <input name=\"fName\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" size=\"64\"><br> \n      <div class=\"sendformhdr\">E-mail:</div>\n      <input name=\"fEmail\" type=\"text\" class=\"sendformfield\" style=\"width:30%\" value=\"\" size=\"64\"> \n      </td>\n    </tr>\n    <tr> \n      <td> <div align=\"left\" class=\"sendformhdr\">\n//#if gref_curLangID==\"rus\"\n&#1057;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;:\n//#else\nMessage:\n//#endif\n      </div>\n        <div align=\"center\"> \n          <textarea name=\"fComment\" rows=\"15\" cols=\"50\" class=\"sendformfield\" style=\"width:100%\"></textarea>\n          <input type=\"hidden\" name=\"fTitle\" value=\"/*$gref_currentGameTitle+\"(\"+gref_currentGameID+\")\"$*/\">\n          <input type=\"hidden\" name=\"fSubject\" value=\"A feedback from ColdCore.ru\">\n\n//#if gref_curLangID==\"rus\"\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/rus/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/rus/send_error.html\">\n//#else\n          <input type=\"hidden\" name=\"fOk\" value=\"http://www.coldcore.ru/eng/send_ok.html\">\n          <input type=\"hidden\" name=\"fBad\" value=\"http://www.coldcore.ru/eng/send_error.html\">\n//#endif\n          <br>\n//#if gref_curLangID==\"rus\"\n          <input type=\"submit\" class=\"sendformhdr\" value=\"&#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;\" >\n//#else\n          <input type=\"submit\" class=\"sendformhdr\" value=\"Send\" >\n//#endif\n        </div></td>\n    </tr>\n  </table>\n</form>\n\n\n    </td>\n    <td width=\"120\" align=\"right\" valign=\"top\"><table width=\"100%%\"  border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n      <tr>\n        <td height=\"30\" align=\"center\" valign=\"middle\" bgcolor=\"#7575FF\">\n        <div align=\"center\" class=\"gameinfoheadermin\">\n//#if gref_curLangID==\"rus\"\n          &nbsp;&#1050;&#1059;&#1055;&#1048;&#1058;&#1068;&nbsp;&#1048;&#1043;&#1056;&#1059;&nbsp;\n//#else\n          &nbsp;PURCHASE&nbsp;\n//#endif\n        </div>\n        </td>\n      </tr>\n      <tr>\n        <td bgcolor=\"#6698FF\"><div align=\"center\"><BR>\n//#local gref_curSalesIndex=0\n//#while gref_curSalesIndex<xml_size(gref_currentSalesList)\n//#local gref_curSalesItem = xml_get(gref_currentSalesList,gref_curSalesIndex)\n//#local gref_curChannel = xml_name(gref_curSalesItem)\n//#local gref_curSalesCost = xml_attr(gref_curSalesItem,\"cost\")\n//#local gref_curSalesProductpage = xml_attr(gref_curSalesItem,\"productpage\")\n//#local gref_curChannelLogo = xml_get(xml_list(gref_channelsList,gref_curChannel),0)\n//#local gref_curChannelName = xml_attr(gref_curChannelLogo,\"name\")\n//#local gref_curChannelLogo = xml_attr(gref_curChannelLogo,\"logo\")\n<a href=\"/*$gref_curSalesProductpage$*/\" target=\"_new\">\n<img src=\"/*$gref_curChannelLogo$*/\" border=\"0\" alt=\"/*$gref_curSalesCost$*/\">\n</a>\n//#local gref_curSalesIndex=gref_curSalesIndex+1\n//#end\n<BR>\n        &nbsp;</div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr bgcolor=\"#FFFFFF\">\n    <td colspan=\"3\" align=\"center\" valign=\"top\"> <hr align=\"center\" noshade>\n    <div>\n      <div align=\"justify\" class=\"footer\">/*$gref_curLangFooter$*/</div>\n    </div></td>\n  </tr>\n</table>\n</body>\n</html>\n//#flush\n//#local gref_curGameIndex = gref_curGameIndex+1\n//#end\n//#local gref_langIndex = gref_langIndex+1\n//#end\n//#outname \"null.txt\""
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/games/games2003_2006.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\n<title>Old mobile games (august 2003-march 2006)</title>\n</head>\n\n<body>\n<h1 align=\"center\">Old mobile games (august 2003 - march 2006) </h1>\n<h4>Summary team at the period </h4>\n<p><em><strong>Producing: </strong></em>Arteom Litvinov, Igor Maznitsa <br>\n<em><strong>Project management: </strong></em>Igor Maznitsa<br>\n<em><strong>Project coordination: </strong></em>Aleksey Goryachev<br>\n<em><strong>Game design:</strong></em> Aleksey Goryachev, Igor Maznitsa<br>\n<em><strong>Level design:</strong></em> Aleksey Goryachev<br>\n  <em><strong>Programming:</strong></em> Alexander Vasiliev, Denis Parinov, Sergey Kuligin, Denis Rozhnev, Igor Maznitsa<br>\n<em><strong>Art:</strong></em> Svetlana Semenova, Andrey Diakov, Dmitriy Semenov, Igor Maznitsa <br>\n  <em><strong>Sound:</strong></em> Igor Maznitsa <br>\n<em><strong>Testing: </strong></em>Aleksey Goryachev</p>\n<hr>\n<p>-----------------------------</p>\n<p><strong>1. Papanin's quest</strong></p>\n<p><img src=\"papaninsquest_splash.jpg\" width=\"100\" height=\"118\">\n  <img src=\"papaninsquest_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"papaninsquest_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"papaninsquest_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>2. Air Aggression</strong></p>\n<p><img src=\"airaggression_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"airaggression_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"airaggression_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"airaggression_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>3. Kalah</strong></p>\n<p><img src=\"kalah_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"kalah_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"kalah_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"kalah_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>4. Mobile chase</strong></p>\n<p><img src=\"mobilechase_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"mobilechase_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"mobilechase_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"mobilechase_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>5. Caspian monster</strong></p>\n<p><img src=\"caspianmonster_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"caspianmonster_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"caspianmonster_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"caspianmonster_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>6. Hunt</strong></p>\n<p><img src=\"hunt_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"hunt_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"hunt_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"hunt_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>7. Raven's cheese</strong></p>\n<p><img src=\"ravenscheese_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"ravenscheese_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"ravenscheese_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"ravenscheese_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>8. Sea road</strong></p>\n<p><img src=\"searoad_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"searoad_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"searoad_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"searoad_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>9. Blazing gears</strong></p>\n<p><img src=\"blazinggears_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"blazinggears_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"blazinggears_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"blazinggears_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>10. Castle assault</strong></p>\n<p><img src=\"castleassault_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"castleassault_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"castleassault_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"castleassault_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>11. Cockroach</strong></p>\n<p><img src=\"cockroach_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"cockroach_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"cockroach_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"cockroach_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>12. Coconuts fall</strong></p>\n<p><img src=\"coconutsfall_splash.jpg\" width=\"100\" height=\"100\">  <img src=\"coconutsfall_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"coconutsfall_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"coconutsfall_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>13. Cone! Cone!</strong></p>\n<p> <img src=\"conecone_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"conecone_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"conecone_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"conecone_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>14. Firing line</strong></p>\n<p><img src=\"firingline_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"firingline_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"firingline_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"firingline_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>15. Fruit mania</strong></p>\n<p><img src=\"fruitmania_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"fruitmania_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"fruitmania_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"fruitmania_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>16. Hard day</strong></p>\n<p><img src=\"hardday_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"hardday_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"hardday_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"hardday_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>17. Ice gifts</strong></p>\n<p><img src=\"icegifts_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"icegifts_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"icegifts_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"icegifts_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>18. Iron stream</strong></p>\n<p><img src=\"ironstream_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"ironstream_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"ironstream_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"ironstream_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>19. Kick Kick</strong></p>\n<p><img src=\"kickkick_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"kickkick_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"kickkick_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"kickkick_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>20. Lifesaver</strong></p>\n<p><img src=\"lifesaver_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"lifesaver_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"lifesaver_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"lifesaver_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>21. Live bridge</strong></p>\n<p><img src=\"livebridge_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"livebridge_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"livebridge_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"livebridge_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>22. Mobile sheriff</strong></p>\n<p><img src=\"mobilesheriff_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"mobilesheriff_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"mobilesheriff_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"mobilesheriff_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>23. Paparazzo</strong></p>\n<p><img src=\"mtvpaparazzo_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"mtvpaparazzo_scr1.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpaparazzo_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpaparazzo_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>24. Pillow war</strong></p>\n<p><img src=\"mtvpillow_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"mtvpillow_scr1.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpillow_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpillow_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>25. MTV Puzzle</strong></p>\n<p><img src=\"mtvpuzzle_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"mtvpuzzle_scr1.gif\" width=\"174\" height=\"204\"> <img src=\"mtvpuzzle_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvpuzzle_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>26. Scene</strong></p>\n<p><img src=\"mtvstage_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"mtvstage_scr1.gif\" width=\"176\" height=\"204\"> <img src=\"mtvstage_scr2.gif\" width=\"176\" height=\"204\"> <img src=\"mtvstage_scr3.gif\" width=\"176\" height=\"204\"></p>\n<p>-----------------------------</p>\n<p><strong>27. Nimble</strong></p>\n<p><img src=\"nimble_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"nimble_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"nimble_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"nimble_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>28. Operation &quot;Thunderclap&quot;</strong></p>\n<p> <img src=\"opthunderclap_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"opthunderclap_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"opthunderclap_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"opthunderclap_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>29. Oyster bank</strong></p>\n<p><img src=\"oysterbank_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"oysterbank_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"oysterbank_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"oysterbank_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>30. Sea rovers</strong></p>\n<p><img src=\"searovers_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"searovers_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"searovers_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"searovers_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>31. Smashing kick</strong></p>\n<p><img src=\"smashingkick_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"smashingkick_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"smashingkick_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"smashingkick_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>32. Spiders</strong></p>\n<p><img src=\"spiders_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"spiders_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"spiders_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"spiders_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>33. Star harbor</strong></p>\n<p><img src=\"starharbor_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"starharbor_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"starharbor_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"starharbor_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>34. Strange Hunt</strong></p>\n<p><img src=\"strangehunt_splash.jpg\" width=\"100\" height=\"110\"> <img src=\"strangehunt_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"strangehunt_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"strangehunt_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>35. Tasty dish</strong></p>\n<p><img src=\"tastydish_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"tastydish_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"tastydish_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"tastydish_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>36. Vineyard</strong></p>\n<p><img src=\"vineyard_splash.jpg\" width=\"100\" height=\"110\"> <img src=\"vineyard_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"vineyard_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"vineyard_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>37. Waterway</strong></p>\n<p><img src=\"waterway_splash.jpg\" width=\"100\" height=\"100\"> <img src=\"waterway_scr1.gif\" width=\"128\" height=\"128\"> <img src=\"waterway_scr2.gif\" width=\"128\" height=\"128\"> <img src=\"waterway_scr3.gif\" width=\"128\" height=\"128\"></p>\n<p>-----------------------------</p>\n<p><strong>38. Wild balls</strong></p>\n<p><img src=\"wildballs_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"wildballs_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"wildballs_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"wildballs_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>39. Wild road</strong></p>\n<p><img src=\"wildroad_splash.jpg\" width=\"100\" height=\"110\"> <img src=\"wildroad_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"wildroad_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"wildroad_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>40. Copter bomber</strong></p>\n<p><img src=\"copterbomber_splash.jpg\" width=\"100\" height=\"118\"> <img src=\"copterbomber_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"copterbomber_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"copterbomber_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>-----------------------------</p>\n<p><strong>41. Drunkman</strong></p>\n<p><img src=\"drunkman_splash.jpg\" width=\"100\" height=\"99\"> <img src=\"drunkman_scr1.gif\" width=\"173\" height=\"179\"> <img src=\"drunkman_scr2.gif\" width=\"173\" height=\"178\"> <img src=\"drunkman_scr3.gif\" width=\"173\" height=\"178\"></p>\n<p>-----------------------------</p>\n<p><strong>42. Fisher</strong></p>\n<p><img src=\"fisher_splash.jpg\" width=\"100\" height=\"125\"> <img src=\"fisher_scr1.gif\" width=\"128\" height=\"160\"> <img src=\"fisher_scr2.gif\" width=\"128\" height=\"160\"> <img src=\"fisher_scr3.gif\" width=\"128\" height=\"160\"></p>\n<p>-----------------------------</p>\n<p><strong>43. Air boil</strong></p>\n<p><img src=\"airboil_splash.jpg\" width=\"100\" height=\"116\"> <img src=\"airboil_scr1.gif\" width=\"176\" height=\"208\"> <img src=\"airboil_scr2.gif\" width=\"176\" height=\"208\"> <img src=\"airboil_scr3.gif\" width=\"176\" height=\"208\"></p>\n<p>&nbsp;</p>\n</body>\n</html>"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/games.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body>\n//#+\n<p align=\"center\"><strong><em><font size=\"4\">Sorry, but the page is still under \n  construction....</font></em></strong></p>\n<p align=\"center\"><img src=\"../undercon.gif\" width=\"40\" height=\"38\"></p>\n<p align=\"center\"><strong><font size=\"4\"><em>Visit us later, please...</em></font></strong></p>\n\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/games.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<data>\n\t<channels>\n\t\t<simone name=\"SIMONE\" logo=\"../logos/simone.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1050;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;</rus>\n\t\t   \t\t<eng>A content provider</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.simone.ru</web>\n\t\t\t   <wap>http://wap.simone.ru</wap>\n\t\t\t</link>\n\t\t</simone>\n\t\t<muzon name=\"MUZON.RU\" logo=\"../logos/muzon.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1052;&#1077;&#1083;&#1086;&#1076;&#1080;&#1080;, &#1080;&#1075;&#1088;&#1099; &#1080; &#1083;&#1086;&#1075;&#1086;&#1090;&#1080;&#1087;&#1099; &#1076;&#1083;&#1103; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1099;&#1093; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1086;&#1074;.</rus>\n\t\t   \t\t<eng>Ringtones, games and logos for mobile phones.</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.muzon.ru</web>\n\t\t\t   <wap>http://wap.muzon.ru</wap>\n\t\t\t</link>\n\t\t</muzon>\n\t\t<ringtime name=\"RINGTIME(R)\" logo=\"../logos/ringtime.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1052;&#1077;&#1083;&#1086;&#1076;&#1080;&#1080;, &#1080;&#1075;&#1088;&#1099; &#1080; &#1083;&#1086;&#1075;&#1086;&#1090;&#1080;&#1087;&#1099; &#1076;&#1083;&#1103; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1099;&#1093; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1086;&#1074;.</rus>\n\t\t   \t\t<eng>Ringtones, games and logos for mobile phones.</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.ringtime.ru</web>\n\t\t\t   <wap>http://wap.muzon.ru</wap>\n\t\t\t</link>\n\t\t</ringtime>\n\t\t<cellcasino name=\"CELLCASINO.RU\" logo=\"../logos/cellcasino.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1040;&#1079;&#1072;&#1088;&#1090;&#1085;&#1099;&#1077; &#1080;&#1075;&#1088;&#1099; &#1085;&#1072; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1086;&#1084; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1077;, &#1085;&#1072; &#1088;&#1077;&#1072;&#1083;&#1100;&#1085;&#1099;&#1077; &#1076;&#1077;&#1085;&#1100;&#1075;&#1080;.</rus>\n\t\t   \t\t<eng>Gambling games on cell phones on real money.</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.cellcasino.ru</web>\n\t\t\t</link>\n\t\t</cellcasino>\n        <nikita name=\"NIKITA\" logo=\"../logos/nikita.gif\">\n    \t    <name>NIKITA</name>\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1050;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;</rus>\n\t\t   \t\t<eng>A content provider</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.nikita.ru</web>\n\t\t\t   <wap>http://wap.nikita.ru</wap>\n\t\t\t</link>\n\t\t</nikita>\n        <infon name=\"INFON(R)\" logo=\"../logos/infon.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1050;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;</rus>\n\t\t   \t\t<eng>A content provider</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.infon.ru</web>\n\t\t\t   <wap>http://wap.infon.ru</wap>\n\t\t\t</link>\n\t\t</infon>\n        <playmobile name=\"Playmobile(TM)\" logo=\"../logos/playmobile.gif\">\n\t\t\t<reference>\n\t\t   \t\t<rus>&#1050;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;</rus>\n\t\t   \t\t<eng>A content provider</eng>\n\t\t\t</reference>\n\t        <link>\n\t\t\t   <web>http://www.playmobile.ru</web>\n\t\t\t   <wap>http://wap.playmobile.ru</wap>\n\t\t\t</link>\n\t\t</playmobile>\n\t</channels>\n\t\n\t<owners>\n\t\t<coldcore link=\"http://www.coldcore.ru\">ColdCore(R)</coldcore>\t\n        <siemensmobile link=\"http://www.siemens-mobile.ru\">Siemens mobile</siemensmobile> \n        <samsungfunclub link=\"http://ru.samsungmobile.com\">SAMSUNG FunClub</samsungfunclub> \n        <mtv link=\"http://www.mtv.ru\">MTV</mtv> \n        <akumiitti link=\"http://www.akumiitti.com\">Akumiitti Oy</akumiitti> \n        <infon link=\"http://www.infon.ru\">INFON</infon>\n        <gamefederation link=\"http://www.gamefederation.com\">Gamefederation</gamefederation>  \n        <cellcasino link=\"http://www.cellcasino.ru\">CellCasino</cellcasino>  \n        <ringtime link=\"http://www.ringtime.ru\">Ringtime(R)</ringtime>  \n\t</owners>\n\t\n\n\t<games>\n\n    <game id=\"aneks_ny2006\"  title=\"The collection 'New Year's jokes'\" year=\"2005\">\n\t    <appsall/>\n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1057;&#1073;&#1086;&#1088;&#1085;&#1080;&#1082; \"&#1053;&#1054;&#1042;&#1054;&#1043;&#1054;&#1044;&#1053;&#1048;&#1045; &#1040;&#1053;&#1045;&#1050;&#1044;&#1054;&#1058;&#1067;\", &#1089;&#1086;&#1076;&#1077;&#1088;&#1078;&#1080;&#1090; 60 &#1086;&#1090;&#1073;&#1086;&#1088;&#1085;&#1099;&#1093; &#1053;&#1086;&#1074;&#1086;&#1075;&#1086;&#1076;&#1085;&#1080;&#1093; &#1080;&#1089;&#1090;&#1086;&#1088;&#1080;&#1081;.</rus>\n           <eng>The collection \"New Year's jokes\" contains 60 jokes.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1103;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1089;&#1073;&#1086;&#1088;&#1085;&#1080;&#1082;&#1086;&#1084; &#1085;&#1086;&#1074;&#1086;&#1075;&#1086;&#1076;&#1085;&#1080;&#1093; &#1072;&#1085;&#1077;&#1082;&#1076;&#1086;&#1090;&#1086;&#1074;, &#1088;&#1072;&#1089;&#1089;&#1086;&#1088;&#1090;&#1080;&#1088;&#1086;&#1074;&#1072;&#1085;&#1085;&#1099;&#1093; &#1087;&#1086; &#1090;&#1077;&#1084;&#1072;&#1084;. &#1042; &#1089;&#1073;&#1086;&#1088;&#1085;&#1080;&#1082; &#1074;&#1086;&#1096;&#1083;&#1086; 60 &#1072;&#1085;&#1077;&#1082;&#1076;&#1086;&#1090;&#1086;&#1074;.</rus>\n           <eng>The application is a collection of jokes, the jokes are sorted on themes. The collection included 60 jokes.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t\t<infon productpage=\"http://www.infon.ru/games.phtml?gid=468361\" cost=\"2.5$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series40dp2b\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2a\"/>\n            <nokia family=\"series60dp2c\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group1\"/>\n            <samsung family=\"group2\"/>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n            <samsung family=\"group6a\"/>\n            <samsung family=\"group6b\"/>\n            <samsung family=\"group7\"/>\n            <samsung family=\"group8\"/>\n            <samsung family=\"group9\"/>\n            <samsung family=\"group10\"/>\n            <samsung family=\"group11\"/>\n            <samsung family=\"group12a\"/>\n            <samsung family=\"group12b\"/>\n            <samsung family=\"group12c\"/>\n            <samsung family=\"group13\"/>\n            <samsung family=\"group14\"/>\n            <samsung family=\"group15a\"/>\n            <samsung family=\"group15b\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n    <game id=\"slider_alpop\"  title=\"Slider 'Aleosha Popovich'\" year=\"2005\">\n\t    <appsall/>\n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1057;&#1083;&#1072;&#1081;&#1076;&#1077;&#1088; &#1087;&#1086; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1086;&#1084;&#1091; &#1084;&#1091;&#1083;&#1100;&#1090;&#1092;&#1080;&#1083;&#1100;&#1084;&#1091; \"&#1040;&#1083;&#1077;&#1096;&#1072; &#1055;&#1086;&#1087;&#1086;&#1074;&#1080;&#1095; &#1080; &#1058;&#1091;&#1075;&#1072;&#1088;&#1080;&#1085; &#1047;&#1084;&#1077;&#1081;\"</rus>\n           <eng>A slide-show of the cartoon film \"Aleosha Popovich and Toogarin Zmey\"</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1057;&#1083;&#1072;&#1081;&#1076;&#1077;&#1088; &#1089;&#1086;&#1076;&#1077;&#1088;&#1078;&#1080;&#1090; 10 &#1082;&#1072;&#1076;&#1088;&#1086;&#1074; &#1084;&#1091;&#1083;&#1100;&#1090;&#1092;&#1080;&#1083;&#1100;&#1084;&#1072; &#1089; &#1090;&#1077;&#1082;&#1089;&#1090;&#1086;&#1084; &#1082; &#1082;&#1072;&#1078;&#1076;&#1086;&#1084;&#1091; &#1082;&#1072;&#1076;&#1088;&#1091;. &#1045;&#1089;&#1090;&#1100; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1100; &#1087;&#1088;&#1086;&#1089;&#1084;&#1086;&#1090;&#1088;&#1072; &#1082;&#1072;&#1076;&#1088;&#1086;&#1074; &#1082;&#1072;&#1082; &#1074; &#1088;&#1091;&#1095;&#1085;&#1086;&#1084; &#1090;&#1072;&#1082; &#1080; &#1074; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1084; &#1088;&#1077;&#1078;&#1080;&#1084;&#1077;. &#1052;&#1086;&#1078;&#1085;&#1086; &#1091;&#1074;&#1077;&#1083;&#1080;&#1095;&#1080;&#1074;&#1072;&#1090;&#1100; &#1074;&#1099;&#1073;&#1088;&#1072;&#1085;&#1085;&#1099;&#1081; &#1082;&#1072;&#1076;&#1088; &#1080; &#1088;&#1072;&#1089;&#1089;&#1084;&#1072;&#1090;&#1088;&#1080;&#1074;&#1072;&#1090;&#1100; &#1086;&#1090;&#1076;&#1077;&#1083;&#1100;&#1085;&#1099;&#1077; &#1076;&#1077;&#1090;&#1072;&#1083;&#1080; &#1080;&#1079;&#1086;&#1073;&#1088;&#1072;&#1078;&#1077;&#1085;&#1080;&#1103;.</rus>\n           <eng>The slide-show contains 10 frames (with texts) from the cartoon film \"Aleosha Popovich and Toogarin Zmey\". You can view the frames in both automatic and manual modes  as well  you can magnify selected frame and consider it.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series40dp2b\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group5\"/>\n            <samsung family=\"group4\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n    <game id=\"smscat\"  title=\"SMS Catalog\" year=\"2005\">\n\t    <appsall/>\n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1069;&#1083;&#1077;&#1082;&#1090;&#1088;&#1086;&#1085;&#1085;&#1099;&#1081; &#1082;&#1072;&#1090;&#1072;&#1083;&#1086;&#1075; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;&#1072; &#1089; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1100;&#1102; &#1079;&#1072;&#1082;&#1072;&#1079;&#1072; &#1080; &#1086;&#1073;&#1085;&#1086;&#1074;&#1083;&#1077;&#1085;&#1080;&#1103; &#1095;&#1077;&#1088;&#1077;&#1079; WAP.</rus>\n           <eng>A mobile catalog of mobile content enables to send SMS for order and can be upgraded via WAP.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1099;&#1081; &#1082;&#1072;&#1090;&#1072;&#1083;&#1086;&#1075; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;&#1072;, &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1102;&#1097;&#1080;&#1081; &#1087;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1102; &#1086;&#1079;&#1085;&#1072;&#1082;&#1086;&#1084;&#1080;&#1090;&#1100;&#1089;&#1103; &#1089; &#1089;&#1086;&#1089;&#1090;&#1072;&#1074;&#1086;&#1084; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;&#1072; &#1074; &#1073;&#1072;&#1079;&#1077; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090; &#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;&#1072; &#1080;, &#1077;&#1089;&#1083;&#1080; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085; &#1080;&#1084;&#1077;&#1077;&#1090; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1100;, &#1086;&#1089;&#1091;&#1097;&#1077;&#1089;&#1090;&#1074;&#1080;&#1090;&#1100; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1082;&#1091; SMS &#1085;&#1072; &#1085;&#1086;&#1084;&#1077;&#1088; &#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;&#1072; &#1089; &#1094;&#1077;&#1083;&#1100;&#1102; &#1079;&#1072;&#1082;&#1072;&#1079;&#1072; &#1087;&#1086;&#1085;&#1088;&#1072;&#1074;&#1080;&#1074;&#1096;&#1077;&#1075;&#1086;&#1089;&#1103; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;&#1072;. &#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1077;&#1090; &#1086;&#1088;&#1075;&#1072;&#1085;&#1080;&#1079;&#1086;&#1074;&#1099;&#1074;&#1072;&#1090;&#1100; &#1089;&#1083;&#1086;&#1078;&#1085;&#1091;&#1102; &#1076;&#1088;&#1077;&#1074;&#1086;&#1074;&#1080;&#1076;&#1085;&#1091;&#1102; &#1089;&#1090;&#1088;&#1091;&#1082;&#1090;&#1091;&#1088;&#1091; &#1082;&#1072;&#1090;&#1072;&#1083;&#1086;&#1075;&#1072; &#1089; &#1074;&#1082;&#1083;&#1102;&#1095;&#1077;&#1085;&#1080;&#1077;&#1084; &#1080;&#1079;&#1086;&#1073;&#1088;&#1072;&#1078;&#1077;&#1085;&#1080;&#1081; &#1076;&#1083;&#1103; &#1087;&#1088;&#1077;&#1076;&#1087;&#1088;&#1086;&#1089;&#1084;&#1086;&#1090;&#1088;&#1072;, &#1080;&#1079;&#1086;&#1073;&#1088;&#1072;&#1078;&#1077;&#1085;&#1080;&#1103; &#1084;&#1086;&#1075;&#1091;&#1090; &#1093;&#1088;&#1072;&#1085;&#1080;&#1090;&#1100;&#1089;&#1103; &#1082;&#1072;&#1082; &#1089; &#1082;&#1072;&#1090;&#1072;&#1083;&#1086;&#1075;&#1086;&#1084; &#1090;&#1072;&#1082; &#1080; &#1073;&#1099;&#1090;&#1100; &#1079;&#1072;&#1075;&#1088;&#1091;&#1078;&#1077;&#1085;&#1085;&#1099;&#1084;&#1080; &#1095;&#1077;&#1088;&#1077;&#1079; &#1089;&#1077;&#1090;&#1100;. &#1055;&#1086;&#1076;&#1076;&#1077;&#1088;&#1078;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; &#1090;&#1088;&#1080; &#1089;&#1093;&#1077;&#1084;&#1099; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1082;&#1080; SMS: Siemens, WMA &#1080; Samsung. &#1071;&#1079;&#1099;&#1082; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1103; &#1088;&#1091;&#1089;&#1089;&#1082;&#1080;&#1081;, &#1087;&#1088;&#1080; &#1080;&#1085;&#1086;&#1084; &#1103;&#1079;&#1099;&#1082;&#1077;, &#1091;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1083;&#1077;&#1085;&#1085;&#1086;&#1084; &#1085;&#1072; &#1072;&#1087;&#1087;&#1072;&#1088;&#1072;&#1090;&#1077; &#1087;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1103;, &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1086;&#1090;&#1086;&#1073;&#1088;&#1072;&#1078;&#1072;&#1077;&#1090; &#1090;&#1077;&#1082;&#1089;&#1090; &#1090;&#1088;&#1072;&#1085;&#1089;&#1083;&#1080;&#1090;&#1086;&#1084;. &#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1076;&#1080;&#1085;&#1072;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1087;&#1086;&#1076;&#1089;&#1090;&#1088;&#1072;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; &#1087;&#1086;&#1076; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1080; &#1072;&#1087;&#1087;&#1072;&#1088;&#1072;&#1090;&#1072; &#1080; &#1084;&#1086;&#1078;&#1077;&#1090; &#1088;&#1072;&#1073;&#1086;&#1090;&#1072;&#1090;&#1100; &#1085;&#1072; &#1083;&#1102;&#1073;&#1086;&#1084; &#1072;&#1087;&#1087;&#1072;&#1088;&#1072;&#1090;&#1077; &#1089; &#1087;&#1083;&#1072;&#1090;&#1092;&#1086;&#1088;&#1084;&#1086;&#1081; &#1085;&#1077; &#1085;&#1080;&#1078;&#1077; MIDP-1.0. &#1057;&#1087;&#1080;&#1089;&#1086;&#1082; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1077;&#1081; &#1086;&#1073;&#1086;&#1083;&#1086;&#1095;&#1082;&#1080; &#1087;&#1088;&#1077;&#1074;&#1099;&#1096;&#1072;&#1077;&#1090; 20 &#1087;&#1091;&#1085;&#1082;&#1090;&#1086;&#1074;.</rus>\n           <eng>The mobile catalog enables to a user to look through contents of a mobile content provider's base and to order liked content with automatically generated SMS (if the device is supporting). The application supports three SMS schemes: Siemens, Samsung and WMA. The application enables to organize complicated tree-structured catalogs. It can be started on any device supports MIDP-1.0 or older.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30bw\"/>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series40dp2b\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series45a\"/>\n            <siemens family=\"series45b\"/>\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\t\n\t<game id=\"fruitmania\"  title=\"FRUITMANIA\" year=\"2005\">\n        <all/>\n\t\t<gambling/>\n\t\t<clientserver/>\n\t\t\t    \n\t    <owner id=\"cellcasino\"/>\n\n        <shortreference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; \"&#1054;&#1076;&#1085;&#1086;&#1088;&#1091;&#1082;&#1086;&#1075;&#1086; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1072;\", &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1102;&#1097;&#1072;&#1103; &#1080;&#1075;&#1088;&#1072;&#1090;&#1100; &#1085;&#1072; &#1088;&#1077;&#1072;&#1083;&#1100;&#1085;&#1099;&#1077; &#1076;&#1077;&#1085;&#1100;&#1075;&#1080;.</rus>\n           <eng>Mobile version of the \"Fruitmania\" casino game enables to play on real money.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1086;&#1075;&#1086; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1072; \"&#1054;&#1076;&#1085;&#1086;&#1088;&#1091;&#1082;&#1080;&#1081; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;\", &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1102;&#1097;&#1072;&#1103; &#1076;&#1077;&#1083;&#1072;&#1090;&#1100; &#1089;&#1090;&#1072;&#1074;&#1082;&#1091; &#1089; &#1088;&#1077;&#1072;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1089;&#1095;&#1077;&#1090;&#1072; &#1074; &#1082;&#1072;&#1079;&#1080;&#1085;&#1086; &#1080; &#1086;&#1089;&#1091;&#1097;&#1077;&#1089;&#1090;&#1074;&#1083;&#1103;&#1090;&#1100; &#1080;&#1075;&#1088;&#1091; &#1095;&#1077;&#1088;&#1077;&#1079; &#1080;&#1085;&#1090;&#1077;&#1088;&#1085;&#1077;&#1090; &#1089; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1072;, &#1074;&#1099;&#1080;&#1075;&#1088;&#1099;&#1074;&#1072;&#1103; &#1088;&#1077;&#1072;&#1083;&#1100;&#1085;&#1099;&#1077; &#1076;&#1077;&#1085;&#1100;&#1075;&#1080;.</rus>\n           <eng>A mobile version of well-known casino game enables to make bet from real casino account and to play via internet from your mobile devices. You can win real money with the game.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesE398\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"strangehunt\"  title=\"STRANGE HUNT\" year=\"2006\">\n        <all/>\n\t\t<shooter/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1058;&#1077;&#1073;&#1103; &#1079;&#1072;&#1085;&#1077;&#1089;&#1083;&#1086; &#1085;&#1072; &#1074;&#1086;&#1077;&#1085;&#1085;&#1099;&#1081; &#1087;&#1086;&#1083;&#1080;&#1075;&#1086;&#1085;, &#1085;&#1086; &#1085;&#1077; &#1089;&#1076;&#1072;&#1074;&#1072;&#1081;&#1089;&#1103;!</rus>\n           <eng>You have come on military range but do not surrender!</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1058;&#1077;&#1073;&#1103; &#1079;&#1072;&#1085;&#1077;&#1089;&#1083;&#1086; &#1085;&#1072; &#1074;&#1086;&#1077;&#1085;&#1085;&#1099;&#1081; &#1087;&#1086;&#1083;&#1080;&#1075;&#1086;&#1085;, &#1085;&#1086; &#1085;&#1077; &#1089;&#1076;&#1072;&#1074;&#1072;&#1081;&#1089;&#1103;! &#1053;&#1077;&#1089;&#1084;&#1086;&#1090;&#1088;&#1103; &#1085;&#1072; &#1090;&#1088;&#1091;&#1076;&#1085;&#1086;&#1089;&#1090;&#1080;, &#1085;&#1072;&#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1081; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1091;&#1090;&#1086;&#1082; &#1080; &#1082;&#1072;&#1073;&#1072;&#1085;&#1086;&#1074;!</rus>\n           <eng>You have come on military range but do not surrender! Shoot as many as possible ducks and wild boars!</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"icegifts\"  title=\"ICE GIFTS\" year=\"2006\">\n        <all/>\n\t\t<logic/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1055;&#1086;&#1084;&#1086;&#1075;&#1080; &#1076;&#1077;&#1076;&#1091; &#1052;&#1086;&#1088;&#1086;&#1079;&#1091; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100; &#1074;&#1089;&#1077; &#1053;&#1086;&#1074;&#1086;&#1075;&#1086;&#1076;&#1085;&#1080;&#1077; &#1087;&#1086;&#1076;&#1072;&#1088;&#1082;&#1080;.</rus>\n           <eng>Help Santa to send all XMas gifts.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1055;&#1086;&#1084;&#1086;&#1075;&#1080; &#1076;&#1077;&#1076;&#1091; &#1052;&#1086;&#1088;&#1086;&#1079;&#1091; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100; &#1074;&#1089;&#1077; &#1053;&#1086;&#1074;&#1086;&#1075;&#1086;&#1076;&#1085;&#1080;&#1077; &#1087;&#1086;&#1076;&#1072;&#1088;&#1082;&#1080;. &#1057;&#1086;&#1074;&#1084;&#1077;&#1097;&#1072;&#1081; &#1080;&#1093; &#1086;&#1076;&#1080;&#1085;&#1072;&#1082;&#1086;&#1074;&#1099;&#1084;&#1080; &#1089;&#1090;&#1086;&#1088;&#1086;&#1085;&#1072;&#1084;&#1080; &#1080; &#1085;&#1077; &#1076;&#1086;&#1087;&#1091;&#1089;&#1082;&#1072;&#1081; &#1086;&#1090;&#1089;&#1091;&#1090;&#1089;&#1090;&#1074;&#1080;&#1103; &#1087;&#1091;&#1089;&#1090;&#1099;&#1093; &#1087;&#1088;&#1086;&#1088;&#1091;&#1073;&#1077;&#1081; &#1076;&#1083;&#1103; &#1085;&#1086;&#1074;&#1099;&#1093; &#1087;&#1086;&#1076;&#1072;&#1088;&#1082;&#1086;&#1074;.</rus>\n           <eng>Help Santa to send all XMas gifts. Combine their identical parties and do not suppose absence of empty ice-holes for new gifts.</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t\n\t\t<game id=\"wildroad\"  title=\"WILD ROAD\" year=\"2006\">\n        <all/>\n\t\t<arcade/>\n\t\t<racing/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1072; &#1074; &#1089;&#1090;&#1080;&#1083;&#1077; &#1041;&#1077;&#1079;&#1091;&#1084;&#1085;&#1099;&#1081; &#1052;&#1072;&#1082;&#1089;. &#1059;&#1081;&#1076;&#1080; &#1086;&#1090; &#1087;&#1086;&#1075;&#1086;&#1085;&#1080; &#1080; &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1081; &#1082;&#1072;&#1085;&#1080;&#1089;&#1090;&#1088;&#1099;.</rus>\n           <eng>Break away from persecutors, do not allow them to destroy your car.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1054;&#1090;&#1086;&#1088;&#1074;&#1080;&#1089;&#1100; &#1086;&#1090; &#1087;&#1088;&#1077;&#1089;&#1083;&#1077;&#1076;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1077;&#1081;, &#1085;&#1077; &#1076;&#1072;&#1081; &#1080;&#1084; &#1087;&#1086;&#1076;&#1086;&#1088;&#1074;&#1072;&#1090;&#1100; &#1090;&#1074;&#1086;&#1102; &#1084;&#1072;&#1096;&#1080;&#1085;&#1091; &#1080;&#1083;&#1080; &#1087;&#1088;&#1099;&#1075;&#1085;&#1091;&#1090;&#1100; &#1085;&#1072; &#1085;&#1077;&#1105;. &#1055;&#1086;&#1076;&#1073;&#1080;&#1088;&#1072;&#1081; &#1082;&#1072;&#1085;&#1080;&#1089;&#1090;&#1088;&#1099;, &#1090;&#1072;&#1082; &#1082;&#1072;&#1082; &#1090;&#1086;&#1087;&#1083;&#1080;&#1074;&#1086; &#1087;&#1086;&#1089;&#1090;&#1086;&#1103;&#1085;&#1085;&#1086; &#1074;&#1099;&#1090;&#1077;&#1082;&#1072;&#1077;&#1090; &#1095;&#1077;&#1088;&#1077;&#1079; &#1087;&#1088;&#1086;&#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1085;&#1085;&#1099;&#1077; &#1073;&#1072;&#1082;&#1080;.</rus>\n           <eng>Break away from persecutors, do not allow them to destroy your car or to jump on it. Pick up jerricans because fuel constantly drips out through the raked tanks.</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"vineyard\"  title=\"VINEYARD\" year=\"2006\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1055;&#1088;&#1080;&#1096;&#1083;&#1072; &#1087;&#1086;&#1088;&#1072; &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1090;&#1100; &#1074;&#1080;&#1085;&#1086;&#1075;&#1088;&#1072;&#1076;, &#1085;&#1086; &#1079;&#1083;&#1086;&#1073;&#1085;&#1099;&#1077; &#1091;&#1083;&#1080;&#1090;&#1082;&#1080;-&#1084;&#1091;&#1090;&#1072;&#1085;&#1090;&#1099; &#1085;&#1077; &#1089;&#1087;&#1103;&#1090;.</rus>\n           <eng>It is the time to collect grapes but evil snails can prevent it.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1057;&#1086;&#1073;&#1080;&#1088;&#1072;&#1081;&#1090;&#1077; &#1074;&#1080;&#1085;&#1086;&#1075;&#1088;&#1072;&#1076; &#1080; &#1088;&#1072;&#1089;&#1082;&#1083;&#1072;&#1076;&#1099;&#1074;&#1072;&#1081;&#1090;&#1077; &#1077;&#1075;&#1086; &#1074; &#1082;&#1086;&#1088;&#1079;&#1080;&#1085;&#1099;, &#1087;&#1077;&#1088;&#1077;&#1093;&#1086;&#1076; &#1085;&#1072; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1081; &#1091;&#1088;&#1086;&#1074;&#1077;&#1085;&#1100; &#1082;&#1086;&#1075;&#1076;&#1072; &#1074;&#1089;&#1077; &#1082;&#1086;&#1088;&#1079;&#1080;&#1085;&#1099; &#1079;&#1072;&#1087;&#1086;&#1083;&#1085;&#1077;&#1085;&#1099;. &#1053;&#1077; &#1087;&#1086;&#1087;&#1072;&#1076;&#1072;&#1081;&#1090;&#1077;&#1089;&#1100; &#1091;&#1083;&#1080;&#1090;&#1082;&#1072;&#1084;!</rus>\n           <eng>Gather grapes and put its into mollies, you must collect all grapes to pass a game level. You must avoid collisions with snails!</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"copterbomber\"  title=\"COPTER BOMBER\" year=\"2006\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1100; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072; &#1087;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1085;&#1086;&#1074;&#1086;&#1075;&#1086; &#1089;&#1091;&#1087;&#1077;&#1088;&#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072;.</rus>\n           <eng>Destroy all enemy tanks and buildings with new supercoter.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1087;&#1080;&#1083;&#1086;&#1090; &#1089;&#1077;&#1082;&#1088;&#1077;&#1090;&#1085;&#1086;&#1075;&#1086; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072;-&#1073;&#1086;&#1084;&#1073;&#1072;&#1088;&#1076;&#1080;&#1088;&#1086;&#1074;&#1097;&#1080;&#1082;&#1072;, &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1100;&#1090;&#1077; &#1074;&#1089;&#1077; &#1074;&#1088;&#1072;&#1078;&#1077;&#1089;&#1082;&#1080;&#1077; &#1094;&#1077;&#1083;&#1080; &#1080; &#1085;&#1077; &#1089;&#1090;&#1072;&#1083;&#1082;&#1080;&#1074;&#1072;&#1081;&#1090;&#1077;&#1089;&#1100; &#1089; &#1074;&#1086;&#1079;&#1076;&#1091;&#1096;&#1085;&#1099;&#1084; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1086;&#1084;.</rus>\n           <eng>You are a pilot of a top secret copter-bomber and your task is to destroy all enemy ground targets. You must avoid collisions with flying enemies.</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"drunkman\"  title=\"TIPPLER\" year=\"2006\">\n        <all/>\n\t\t<gambling/>\n\t\t<erotic/>\n\t    \n\t    <owner id=\"ringtime\"/>\n\n        <shortreference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1082;&#1072;&#1088;&#1090;&#1086;&#1095;&#1085;&#1086;&#1081; &#1080;&#1075;&#1088;&#1099; &#1055;&#1068;&#1071;&#1053;&#1048;&#1062;&#1040; &#1085;&#1072; &#1088;&#1072;&#1079;&#1076;&#1077;&#1074;&#1072;&#1085;&#1080;&#1077;.</rus>\n           <eng>A mobile version of the card game TIPPLER.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1082;&#1072;&#1088;&#1090;&#1086;&#1095;&#1085;&#1086;&#1081; &#1080;&#1075;&#1088;&#1099; &#1055;&#1068;&#1071;&#1053;&#1048;&#1062;&#1040;. &#1048;&#1075;&#1088;&#1072; &#1085;&#1072; &#1088;&#1072;&#1079;&#1076;&#1077;&#1074;&#1072;&#1085;&#1080;&#1077; &#1089; &#1090;&#1088;&#1077;&#1084;&#1103; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;&#1084;&#1080;.</rus>\n           <eng>A mobile version of the TIPPLER card game. You can select one from three opponents and to play with it for undressing.</eng>\n\t\t</reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\n\t<game id=\"airboil\"  title=\"AIR BOIL\" year=\"2005\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1054;&#1089;&#1074;&#1086;&#1073;&#1086;&#1076;&#1080; &#1078;&#1080;&#1090;&#1077;&#1083;&#1077;&#1081; &#1076;&#1072;&#1083;&#1077;&#1082;&#1086;&#1081; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1099; &#1086;&#1090; &#1075;&#1086;&#1089;&#1087;&#1086;&#1076;&#1089;&#1090;&#1074;&#1072; &#1084;&#1072;&#1096;&#1080;&#1085;.</rus>\n           <eng>Release a distant planet from machines' domination.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042; 2050 &#1075;&#1086;&#1076;&#1091;, &#1073;&#1099;&#1083;&#1072; &#1086;&#1073;&#1085;&#1072;&#1088;&#1091;&#1078;&#1077;&#1085;&#1072; &#1086;&#1090;&#1076;&#1072;&#1083;&#1077;&#1085;&#1085;&#1072;&#1103; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1072; &#1089; &#1086;&#1095;&#1077;&#1085;&#1100; &#1085;&#1080;&#1079;&#1082;&#1086;&#1081; &#1075;&#1088;&#1072;&#1074;&#1080;&#1090;&#1072;&#1094;&#1080;&#1077;&#1081;. &#1046;&#1080;&#1090;&#1077;&#1083;&#1080; &#1101;&#1090;&#1086;&#1081; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1099; &#1086;&#1082;&#1072;&#1079;&#1072;&#1083;&#1080;&#1089;&#1100; &#1087;&#1086;&#1088;&#1072;&#1073;&#1086;&#1097;&#1077;&#1085;&#1099; &#1095;&#1077;&#1090;&#1099;&#1088;&#1100;&#1084;&#1103; &#1086;&#1075;&#1088;&#1086;&#1084;&#1085;&#1099;&#1084;&#1080; &#1084;&#1072;&#1096;&#1080;&#1085;&#1086;&#1087;&#1086;&#1076;&#1086;&#1073;&#1085;&#1099;&#1084;&#1080; &#1087;&#1088;&#1080;&#1096;&#1077;&#1083;&#1100;&#1094;&#1072;&#1084;&#1080;. &#1044;&#1077;&#1084;&#1086;&#1082;&#1088;&#1072;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1072;&#1103; &#1047;&#1077;&#1084;&#1083;&#1103; &#1085;&#1077; &#1089;&#1084;&#1086;&#1075;&#1083;&#1072; &#1089;&#1084;&#1080;&#1088;&#1080;&#1090;&#1100;&#1089;&#1103; &#1089; &#1090;&#1072;&#1082;&#1080;&#1084; &#1089;&#1086;&#1089;&#1090;&#1086;&#1103;&#1085;&#1080;&#1077;&#1081;&#1084; &#1076;&#1077;&#1083; &#1080; &#1082;&#1086;&#1089;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080;&#1081; &#1096;&#1072;&#1090;&#1090;&#1083; &#1076;&#1086;&#1089;&#1090;&#1072;&#1074;&#1080;&#1083; &#1085;&#1072; &#1101;&#1090;&#1091; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1091; &#1089;&#1091;&#1087;&#1077;&#1088;&#1089;&#1087;&#1077;&#1094;&#1085;&#1072;&#1079;&#1086;&#1074;&#1094;&#1072; &#1044;&#1078;&#1086;&#1085;&#1072; &#1055;&#1077;&#1090;&#1088;&#1086;&#1074;&#1072;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1080; &#1073;&#1099;&#1083; &#1089;&#1073;&#1088;&#1086;&#1096;&#1077;&#1085; &#1085;&#1072; &#1087;&#1086;&#1074;&#1077;&#1088;&#1093;&#1085;&#1086;&#1089;&#1090;&#1100; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1099; &#1074;&#1084;&#1077;&#1089;&#1090;&#1077; &#1089; &#1074;&#1077;&#1083;&#1086;&#1089;&#1080;&#1087;&#1077;&#1076;&#1086;&#1084; &#1080; &#1088;&#1072;&#1082;&#1077;&#1090;&#1085;&#1086;&#1081; &#1091;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1082;&#1086;&#1081; &#1076;&#1083;&#1103; &#1085;&#1072;&#1074;&#1077;&#1076;&#1077;&#1085;&#1080;&#1103; &#1076;&#1077;&#1084;&#1086;&#1082;&#1088;&#1072;&#1090;&#1080;&#1080; &#1080; &#1084;&#1086;&#1089;&#1090;&#1086;&#1074; &#1076;&#1088;&#1091;&#1078;&#1073;&#1099;. &#1048;&#1090;&#1072;&#1082;, &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1080;&#1075;&#1088;&#1072;&#1102;&#1097;&#1077;&#1075;&#1086; - &#1087;&#1088;&#1086;&#1081;&#1090;&#1080; 20 &#1091;&#1088;&#1086;&#1074;&#1085;&#1077;&#1081; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1072;&#1103; &#1088;&#1072;&#1079;&#1083;&#1080;&#1095;&#1085;&#1091;&#1102; &#1083;&#1077;&#1090;&#1072;&#1102;&#1097;&#1091;&#1102; &#1085;&#1077;&#1095;&#1080;&#1089;&#1090;&#1100; &#1080; &#1091;&#1082;&#1083;&#1086;&#1085;&#1103;&#1103;&#1089;&#1100; &#1086;&#1090; &#1084;&#1077;&#1090;&#1077;&#1086;&#1088;&#1080;&#1090;&#1085;&#1099;&#1093; &#1076;&#1086;&#1078;&#1076;&#1077;&#1081;, &#1074;&#1077;&#1089;&#1100;&#1084;&#1072; &#1095;&#1072;&#1089;&#1090;&#1099;&#1093; &#1085;&#1072; &#1101;&#1090;&#1086;&#1081; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1077;. &#1048;&#1075;&#1088;&#1086;&#1074;&#1099;&#1077; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1080; &#1084;&#1086;&#1078;&#1085;&#1086; &#1087;&#1086;&#1087;&#1086;&#1083;&#1085;&#1103;&#1090;&#1100;, &#1087;&#1086;&#1076;&#1073;&#1080;&#1088;&#1072;&#1103; &#1087;&#1072;&#1076;&#1072;&#1102;&#1097;&#1080;&#1077; &#1087;&#1088;&#1086;&#1087;&#1077;&#1083;&#1083;&#1077;&#1088;&#1099;, &#1072; &#1087;&#1072;&#1090;&#1088;&#1086;&#1085;&#1099; &#1087;&#1088;&#1080;&#1083;&#1077;&#1090;&#1072;&#1102;&#1090; &#1085;&#1072; &#1074;&#1086;&#1079;&#1076;&#1091;&#1096;&#1085;&#1099;&#1093; &#1096;&#1072;&#1088;&#1072;&#1093;.</rus>\n           <eng>In 2050, the remote planet with very low gravitation had been found. Inhabitants of the planet have been enslaved by four huge machine like aliens. The democratic Earth couldn&#8217;t reconcile with such state  and a space shuttle had delivered to this planet a super agent John Petroff who had been dumped on a surface of the planet together with a bicycle and a rocket mount for prompting democracy and bridges of friendship. So, the task of a player is to pass 20 game levels and to destroy all flying objects on levels.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <infon productpage=\"http://www.infon.ru/games.phtml?gid=468360\" cost=\"2.5$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"starharbor\"  title=\"STAR HARBOR\" year=\"2005\">\n        <all/>\n\t\t<shooter/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1078;&#1072;&#1089;&#1085;&#1086;&#1077; &#1074;&#1090;&#1086;&#1088;&#1078;&#1077;&#1085;&#1080;&#1077; &#1075;&#1088;&#1086;&#1079;&#1080;&#1090; &#1047;&#1077;&#1084;&#1083;&#1077;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1086;&#1088;&#1091;&#1076;&#1080;&#1077;&#1084; &#1082;&#1086;&#1089;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1075;&#1086; &#1082;&#1088;&#1077;&#1081;&#1089;&#1077;&#1088;&#1072; &#1080; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1086;&#1090;&#1073;&#1080;&#1090;&#1100; &#1072;&#1090;&#1072;&#1082;&#1091;, &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1080;&#1074; &#1074;&#1089;&#1077; &#1082;&#1088;&#1077;&#1081;&#1089;&#1077;&#1088;&#1099; &#1080; &#1080;&#1089;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083;&#1080;.</rus>\n           <eng>A terrible invasion threatens the Earth.A player is a gunner of a star cruiser gun and your task is to stop the invasion.You have to destroy both cruisers and fighters.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1085;&#1086;&#1081; &#1088;&#1072;&#1079; &#1075;&#1072;&#1076;&#1082;&#1080;&#1077; &#1080;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1103;&#1085;&#1077; &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1102;&#1090;&#1089;&#1103; &#1087;&#1086;&#1087;&#1088;&#1072;&#1090;&#1100; &#1089;&#1074;&#1086;&#1080;&#1084;&#1080; &#1097;&#1091;&#1087;&#1072;&#1083;&#1100;&#1094;&#1072;&#1084;&#1080; &#1085;&#1072;&#1096;&#1091; &#1075;&#1086;&#1083;&#1091;&#1073;&#1091;&#1102; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1091;, &#1085;&#1086; &#1086;&#1085;&#1080; &#1085;&#1077; &#1091;&#1095;&#1083;&#1080; &#1090;&#1086;&#1075;&#1086;, &#1095;&#1090;&#1086; ,&#1085;&#1077;&#1089;&#1084;&#1086;&#1090;&#1088;&#1103; &#1085;&#1072; &#1074;&#1089;&#1077; &#1091;&#1089;&#1080;&#1083;&#1080;&#1103; &#1087;&#1086; &#1091;&#1082;&#1083;&#1086;&#1085;&#1077;&#1085;&#1080;&#1102; &#1086;&#1090; &#1074;&#1086;&#1080;&#1085;&#1089;&#1082;&#1086;&#1081; &#1087;&#1086;&#1074;&#1080;&#1085;&#1085;&#1086;&#1089;&#1090;&#1080;, &#1083;&#1102;&#1073;&#1080;&#1090;&#1077;&#1083;&#1100; &#1082;&#1086;&#1084;&#1087;&#1100;&#1102;&#1090;&#1077;&#1088;&#1085;&#1099;&#1093; &#1080;&#1075;&#1088; &#1048;&#1074;&#1072;&#1085; &#1050;&#1086;&#1087;&#1095;&#1077;&#1085;&#1099;&#1081; &#1073;&#1099;&#1083; &#1079;&#1072;&#1073;&#1088;&#1080;&#1090; &#1074; &#1082;&#1086;&#1089;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080;&#1081; &#1092;&#1083;&#1086;&#1090; &#1080; &#1085;&#1072;&#1093;&#1086;&#1076;&#1080;&#1083;&#1089;&#1103; &#1089;&#1088;&#1077;&#1076;&#1080; &#1085;&#1086;&#1102;&#1097;&#1080;&#1093; &#1086; &#1088;&#1086;&#1076;&#1085;&#1086;&#1084; &#1076;&#1086;&#1084;&#1077; &#1087;&#1088;&#1080;&#1079;&#1099;&#1074;&#1085;&#1080;&#1082;&#1086;&#1074; &#1085;&#1072; &#1073;&#1086;&#1088;&#1090;&#1091; &#1082;&#1086;&#1089;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1075;&#1086; &#1082;&#1088;&#1077;&#1081;&#1089;&#1077;&#1088;&#1072; \"&#1063;&#1077;&#1088;&#1074;&#1086;&#1085;&#1072; &#1059;&#1082;&#1088;&#1072;&#1080;&#1085;&#1072;\", &#1075;&#1086;&#1090;&#1086;&#1074;&#1103;&#1097;&#1077;&#1075;&#1086;&#1089;&#1103; &#1082; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1083;&#1077;&#1085;&#1080;&#1102; &#1085;&#1072; &#1075;&#1088;&#1072;&#1085;&#1080;&#1094;&#1099; &#1089;&#1086;&#1083;&#1085;&#1077;&#1095;&#1085;&#1086;&#1081; &#1089;&#1080;&#1089;&#1090;&#1077;&#1084;&#1099; &#1089; &#1086;&#1088;&#1073;&#1080;&#1090;&#1099; &#1047;&#1077;&#1084;&#1083;&#1080;. &#1053;&#1077;&#1086;&#1078;&#1080;&#1076;&#1072;&#1085;&#1085;&#1086;&#1077; &#1085;&#1072;&#1087;&#1072;&#1076;&#1077;&#1085;&#1080;&#1077; &#1087;&#1088;&#1080;&#1096;&#1077;&#1083;&#1100;&#1094;&#1077;&#1074; &#1090;&#1072;&#1082; &#1087;&#1086;&#1088;&#1072;&#1079;&#1080;&#1083;&#1086; &#1082;&#1086;&#1084;&#1072;&#1085;&#1076;&#1085;&#1099;&#1081; &#1089;&#1086;&#1089;&#1090;&#1072;&#1074; &#1082;&#1088;&#1077;&#1081;&#1089;&#1077;&#1088;&#1072;, &#1095;&#1090;&#1086; &#1086;&#1085;&#1086; &#1085;&#1077;&#1084;&#1077;&#1076;&#1083;&#1077;&#1085;&#1085;&#1086; &#1091;&#1096;&#1083;&#1086; &#1074; &#1079;&#1072;&#1087;&#1086;&#1081; &#1083;&#1077;&#1095;&#1080;&#1090;&#1100; &#1085;&#1077;&#1088;&#1074;&#1099; &#1080; &#1048;&#1074;&#1072;&#1085; &#1086;&#1089;&#1090;&#1072;&#1083;&#1089;&#1103; &#1077;&#1076;&#1080;&#1085;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1099;&#1084; &#1076;&#1077;&#1077;&#1089;&#1087;&#1086;&#1089;&#1086;&#1073;&#1085;&#1099;&#1084; &#1095;&#1083;&#1077;&#1085;&#1086;&#1084; &#1101;&#1082;&#1080;&#1087;&#1072;&#1078;&#1072;. &#1048;&#1090;&#1072;&#1082;, &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1086;&#1090;&#1088;&#1072;&#1079;&#1080;&#1090;&#1100; &#1085;&#1072;&#1087;&#1072;&#1076;&#1077;&#1085;&#1080;&#1077;, &#1087;&#1091;&#1090;&#1077;&#1084; &#1090;&#1086;&#1090;&#1072;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;&#1080;&#1103; &#1072;&#1090;&#1072;&#1082;&#1091;&#1102;&#1097;&#1080;&#1093; &#1089;&#1080;&#1083;. &#1048;&#1075;&#1088;&#1072; &#1086;&#1090; &#1087;&#1077;&#1088;&#1074;&#1086;&#1075;&#1086; &#1083;&#1080;&#1094;&#1072; &#1080;&#1079; &#1088;&#1072;&#1079;&#1088;&#1103;&#1076;&#1072; \"&#1059;&#1073;&#1077;&#1081; &#1080;&#1093; &#1074;&#1089;&#1077;&#1093;\", &#1080;&#1084;&#1077;&#1077;&#1090; &#1090;&#1088;&#1080; &#1091;&#1088;&#1086;&#1074;&#1085;&#1103; &#1089;&#1083;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1080;, &#1088;&#1072;&#1079;&#1083;&#1080;&#1095;&#1072;&#1102;&#1097;&#1080;&#1077;&#1089;&#1103; &#1072;&#1082;&#1090;&#1080;&#1074;&#1085;&#1086;&#1089;&#1090;&#1100;&#1102; &#1080; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1086;&#1084; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;. </rus>\n           <eng>A terrible invasion threatens the Earth.A player is a gunner of a star cruiser gun and your task is to stop the invasion.You have to destroy both cruisers and fighters.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <infon productpage=\"http://www.infon.ru/games.phtml?gid=468366\" cost=\"2.5$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series30bw\"/>\n            <nokia family=\"series30c\"/>\n         \t<nokia family=\"series40dp1\"/>\n            <nokia family=\"series40dp2\"/>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n\n            <siemens family=\"series45a\"/>\n            <siemens family=\"series45b\"/>\n            <siemens family=\"series55a\"/>\n            <siemens family=\"series55b\"/>\n            <siemens family=\"series65a\"/>\n            <siemens family=\"series65b\"/>\n            \n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n\n            <lg family=\"seriesG1600\"/>\n\n            <se family=\"series610\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"kalah\"  title=\"KALAH\" year=\"2004\">\n        <all/>\n\t\t<logic/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1086;&#1081; &#1085;&#1072;&#1089;&#1090;&#1086;&#1083;&#1100;&#1085;&#1086;&#1081; &#1080;&#1075;&#1088;&#1099; &#1050;&#1040;&#1051;&#1040;&#1061;. &#1062;&#1077;&#1083;&#1100; &#1080;&#1075;&#1088;&#1099; - &#1074;&#1079;&#1103;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1072;&#1084;&#1085;&#1077;&#1081;.</rus>\n           <eng>A mobile version of the well known KALAH game. The object of the game is to move as many stones as possible into your KALAH (right bowl).</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1052;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1072;&#1103; &#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1086;&#1081; &#1083;&#1086;&#1075;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1081; &#1080;&#1075;&#1088;&#1099; Kalah. &#1047;&#1072;&#1076;&#1072;&#1095;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1089;&#1086;&#1073;&#1088;&#1072;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1072;&#1084;&#1085;&#1077;&#1081; &#1074; &#1089;&#1074;&#1086;&#1081; &#1082;&#1072;&#1083;&#1072;&#1093; (&#1087;&#1088;&#1072;&#1074;&#1072;&#1103; &#1083;&#1086;&#1078;&#1073;&#1080;&#1085;&#1082;&#1072; &#1085;&#1072; &#1080;&#1075;&#1088;&#1086;&#1074;&#1086;&#1084; &#1087;&#1086;&#1083;&#1077;). &#1055;&#1088;&#1080; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1085;&#1086;&#1084; &#1093;&#1086;&#1076;&#1077; &#1080;&#1075;&#1088;&#1072;&#1102;&#1097;&#1080;&#1081; &#1089;&#1085;&#1080;&#1084;&#1072;&#1077;&#1090; &#1089; &#1086;&#1076;&#1085;&#1086;&#1075;&#1086; &#1080;&#1079; &#1089;&#1074;&#1086;&#1080;&#1093; &#1087;&#1086;&#1083;&#1077;&#1081; &#1074;&#1089;&#1077; &#1082;&#1072;&#1084;&#1085;&#1080; &#1080; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1090; &#1080;&#1093; &#1087;&#1086; &#1086;&#1076;&#1085;&#1086;&#1084;&#1091; &#1085;&#1072; &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1077; &#1087;&#1086;&#1083;&#1103; &#1074; &#1087;&#1086;&#1088;&#1103;&#1076;&#1082;&#1077; &#1074;&#1086;&#1079;&#1088;&#1072;&#1089;&#1090;&#1072;&#1085;&#1080;&#1103; &#1080;&#1093; &#1085;&#1086;&#1084;&#1077;&#1088;&#1086;&#1074;; &#1087;&#1086;&#1083;&#1077;&#1084;, &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1084; &#1079;&#1072; &#1096;&#1077;&#1089;&#1090;&#1099;&#1084;, &#1089;&#1095;&#1080;&#1090;&#1072;&#1077;&#1090;&#1089;&#1103; &#1089;&#1074;&#1086;&#1081; &#1082;&#1072;&#1083;&#1072;&#1093;. &#1044;&#1072;&#1083;&#1077;&#1077; &#1082;&#1072;&#1084;&#1085;&#1080; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1087;&#1086; &#1095;&#1091;&#1078;&#1080;&#1084; &#1087;&#1086;&#1083;&#1103;&#1084; (&#1086;&#1087;&#1103;&#1090;&#1100;-&#1090;&#1072;&#1082;&#1080; &#1074; &#1087;&#1086;&#1088;&#1103;&#1076;&#1082;&#1077; &#1074;&#1086;&#1079;&#1088;&#1072;&#1089;&#1090;&#1072;&#1085;&#1080;&#1103; &#1080;&#1093; &#1085;&#1086;&#1084;&#1077;&#1088;&#1086;&#1074;), &#1079;&#1072;&#1090;&#1077;&#1084; &#1074;&#1085;&#1086;&#1074;&#1100; &#1087;&#1086; &#1089;&#1074;&#1086;&#1080;&#1084; (&#1095;&#1091;&#1078;&#1086;&#1081; &#1082;&#1072;&#1083;&#1072;&#1093; &#1087;&#1088;&#1086;&#1087;&#1091;&#1089;&#1082;&#1072;&#1077;&#1090;&#1089;&#1103;) &#1080; &#1090;&#1072;&#1082; &#1076;&#1072;&#1083;&#1077;&#1077;, &#1082;&#1072;&#1082; &#1073;&#1099; &#1089;&#1086;&#1074;&#1077;&#1088;&#1096;&#1072;&#1103; &#1086;&#1073;&#1093;&#1086;&#1076; &#1087;&#1086;&#1083;&#1077;&#1081; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074; &#1095;&#1072;&#1089;&#1086;&#1074;&#1086;&#1081; &#1089;&#1090;&#1088;&#1077;&#1083;&#1082;&#1080;. &#1045;&#1089;&#1083;&#1080; &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1085;&#1080;&#1081; &#1080;&#1079; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084;&#1099;&#1093; &#1082;&#1072;&#1084;&#1085;&#1077;&#1081; &#1087;&#1086;&#1087;&#1072;&#1083; &#1074; &#171;&#1089;&#1074;&#1086;&#1081;&#187; &#1082;&#1072;&#1083;&#1072;&#1093;, &#1090;&#1086; &#1080;&#1075;&#1088;&#1086;&#1082; &#1076;&#1077;&#1083;&#1072;&#1077;&#1090; &#1077;&#1097;&#1077; &#1086;&#1076;&#1080;&#1085; &#1093;&#1086;&#1076;. &#1042;&#1086; &#1074;&#1089;&#1077;&#1093; &#1086;&#1089;&#1090;&#1072;&#1083;&#1100;&#1085;&#1099;&#1093; &#1089;&#1083;&#1091;&#1095;&#1072;&#1103;&#1093; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1100; &#1093;&#1086;&#1076;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1077;&#1090;&#1089;&#1103; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1091;. &#1045;&#1089;&#1083;&#1080; &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1085;&#1080;&#1081; &#1082;&#1072;&#1084;&#1077;&#1085;&#1100; &#1087;&#1086;&#1087;&#1072;&#1083; &#1085;&#1072; &#1087;&#1091;&#1089;&#1090;&#1086;&#1077; &#1087;&#1086;&#1083;&#1077; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072;, &#1089;&#1086;&#1074;&#1077;&#1088;&#1096;&#1072;&#1074;&#1096;&#1077;&#1075;&#1086; &#1093;&#1086;&#1076;, &#1072; &#1085;&#1072; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1086;&#1087;&#1086;&#1083;&#1086;&#1078;&#1085;&#1086;&#1084; &#1087;&#1086;&#1083;&#1077; &#1089;&#1086;&#1087;&#1077;&#1088;&#1085;&#1080;&#1082;&#1072; &#1077;&#1089;&#1090;&#1100; &#1093;&#1086;&#1090;&#1103; &#1073;&#1099; &#1086;&#1076;&#1080;&#1085; &#1082;&#1072;&#1084;&#1077;&#1085;&#1100;, &#1090;&#1086; &#1089;&#1086;&#1076;&#1077;&#1088;&#1078;&#1080;&#1084;&#1086;&#1077; &#1086;&#1073;&#1086;&#1080;&#1093; &#1087;&#1086;&#1083;&#1077;&#1081; &#1087;&#1077;&#1088;&#1077;&#1085;&#1086;&#1089;&#1080;&#1090;&#1089;&#1103; &#1074; &#1050;&#1040;&#1051;&#1040;&#1061; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072;, &#1089;&#1086;&#1074;&#1077;&#1088;&#1096;&#1072;&#1074;&#1096;&#1077;&#1075;&#1086; &#1093;&#1086;&#1076; (&#1087;&#1086;&#1089;&#1083;&#1077; &#1095;&#1077;&#1075;&#1086;, &#1093;&#1086;&#1076; &#1087;&#1077;&#1088;&#1077;&#1093;&#1086;&#1076;&#1080;&#1090; &#1082; &#1077;&#1075;&#1086; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1091;). &#1045;&#1089;&#1083;&#1080; &#1085;&#1072; &#1087;&#1086;&#1083;&#1103;&#1093; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072;, &#1089;&#1076;&#1077;&#1083;&#1072;&#1074;&#1096;&#1077;&#1075;&#1086; &#1093;&#1086;&#1076;, &#1085;&#1077; &#1086;&#1089;&#1090;&#1072;&#1077;&#1090;&#1089;&#1103; &#1085;&#1080; &#1086;&#1076;&#1085;&#1086;&#1075;&#1086; &#1082;&#1072;&#1084;&#1085;&#1103;, &#1090;&#1086; &#1074;&#1089;&#1077; &#1082;&#1072;&#1084;&#1085;&#1080;, &#1085;&#1072;&#1093;&#1086;&#1076;&#1103;&#1097;&#1080;&#1077;&#1089;&#1103; &#1085;&#1072; &#1087;&#1086;&#1083;&#1103;&#1093; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;, &#1087;&#1077;&#1088;&#1077;&#1085;&#1086;&#1089;&#1103;&#1090;&#1089;&#1103; &#1074; &#1082;&#1072;&#1083;&#1072;&#1093; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;, &#1080; &#1080;&#1075;&#1088;&#1072; &#1079;&#1072;&#1082;&#1072;&#1085;&#1095;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103;. &#1048;&#1075;&#1088;&#1072; &#1079;&#1072;&#1082;&#1072;&#1085;&#1095;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103;, &#1082;&#1086;&#1075;&#1076;&#1072; &#1086;&#1076;&#1085;&#1086;&#1084;&#1091; &#1080;&#1079; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1086;&#1074; &#1085;&#1077;&#1095;&#1077;&#1084; &#1093;&#1086;&#1076;&#1080;&#1090;&#1100;. &#1042;&#1099;&#1080;&#1075;&#1088;&#1099;&#1074;&#1072;&#1077;&#1090; &#1090;&#1086;&#1090;, &#1091; &#1082;&#1086;&#1075;&#1086; &#1087;&#1086; &#1086;&#1082;&#1086;&#1085;&#1095;&#1072;&#1085;&#1080;&#1080; &#1080;&#1075;&#1088;&#1099; &#1074; &#1082;&#1072;&#1083;&#1072;&#1093;&#1077; &#1086;&#1082;&#1072;&#1079;&#1072;&#1083;&#1086;&#1089;&#1100; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1072;&#1084;&#1085;&#1077;&#1081;. &#1045;&#1089;&#1083;&#1080; &#1074; &#1086;&#1073;&#1086;&#1080;&#1093; &#1082;&#1072;&#1083;&#1072;&#1093;&#1072;&#1093; &#1085;&#1072;&#1093;&#1086;&#1076;&#1080;&#1090;&#1089;&#1103; &#1087;&#1086; 36 &#1082;&#1072;&#1084;&#1085;&#1077;&#1081;, &#1092;&#1080;&#1082;&#1089;&#1080;&#1088;&#1091;&#1077;&#1090;&#1089;&#1103; &#1085;&#1080;&#1095;&#1100;&#1103;.</rus>\n           <eng>A mobile version of the well known KALAH game. The object of the game is to move as many stones as possible into your KALAH (right bowl).</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <playmobile productpage=\"http://www.playmobile.ru/games/logic/Kalah\" cost=\"3$\"/>\n  \t\t   <nikita productpage=\"http://www.888x.ru/javagames/show.php?ng=2059&amp;actnum=1&amp;md=76\" cost=\"3$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"papaninsquest\"  title=\"PAPANIN'S QUEST\" year=\"2004\">\n        <all/>\n\t\t<quest/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1080;&#1075;&#1088;&#1072;&#1077;&#1090; &#1079;&#1072; &#1087;&#1091;&#1090;&#1077;&#1096;&#1077;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1080;&#1082;&#1072; &#1055;&#1072;&#1087;&#1072;&#1085;&#1080;&#1085;&#1072;, &#1087;&#1088;&#1086;&#1074;&#1072;&#1083;&#1080;&#1074;&#1096;&#1077;&#1075;&#1086;&#1089;&#1103; &#1074; &#1091;&#1078;&#1072;&#1089;&#1085;&#1091;&#1102; &#1087;&#1080;&#1088;&#1072;&#1084;&#1080;&#1076;&#1091; &#1085;&#1072; &#1070;&#1078;&#1085;&#1086;&#1084; &#1087;&#1086;&#1083;&#1102;&#1089;&#1077; &#1080; &#1080;&#1097;&#1091;&#1097;&#1077;&#1075;&#1086; &#1087;&#1091;&#1090;&#1100; &#1076;&#1086;&#1084;&#1086;&#1081;.</rus>\n           <eng>You have to help Papanin to find the way out of the terrible maze. The object of the game is to collect all magic stones in the maze.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1055;&#1091;&#1090;&#1077;&#1096;&#1077;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1080;&#1082; &#1055;&#1072;&#1087;&#1072;&#1085;&#1080;&#1085; &#1086;&#1073;&#1085;&#1072;&#1088;&#1091;&#1078;&#1080;&#1083; &#1077;&#1075;&#1080;&#1087;&#1077;&#1090;&#1089;&#1082;&#1091;&#1102; &#1087;&#1080;&#1088;&#1072;&#1084;&#1080;&#1076;&#1091;, &#1079;&#1072;&#1090;&#1077;&#1088;&#1103;&#1085;&#1085;&#1091;&#1102; &#1074;&#1086; &#1083;&#1100;&#1076;&#1072;&#1093; &#1040;&#1085;&#1090;&#1072;&#1088;&#1082;&#1090;&#1080;&#1082;&#1080;. &#1055;&#1088;&#1080; &#1086;&#1089;&#1084;&#1086;&#1090;&#1088;&#1077; &#1086;&#1085; &#1087;&#1088;&#1086;&#1074;&#1072;&#1083;&#1080;&#1083;&#1089;&#1103; &#1074; &#1088;&#1072;&#1089;&#1097;&#1077;&#1083;&#1080;&#1085;&#1091; &#1080; &#1086;&#1082;&#1072;&#1079;&#1072;&#1083;&#1089;&#1103; &#1074;&#1085;&#1091;&#1090;&#1088;&#1080;. &#1047;&#1072;&#1076;&#1072;&#1095;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#8212; &#1087;&#1086;&#1084;&#1086;&#1095;&#1100; &#1055;&#1072;&#1087;&#1072;&#1085;&#1080;&#1085;&#1091; &#1074;&#1099;&#1073;&#1088;&#1072;&#1090;&#1100;&#1089;&#1103; &#1085;&#1072;&#1088;&#1091;&#1078;&#1091;, &#1087;&#1088;&#1077;&#1086;&#1076;&#1086;&#1083;&#1077;&#1074; 10 &#1080;&#1075;&#1088;&#1086;&#1074;&#1099;&#1093; &#1091;&#1088;&#1086;&#1074;&#1085;&#1077;&#1081;. &#1063;&#1090;&#1086;&#1073;&#1099; &#1087;&#1088;&#1086;&#1081;&#1090;&#1080; &#1080;&#1075;&#1088;&#1086;&#1074;&#1086;&#1081; &#1091;&#1088;&#1086;&#1074;&#1077;&#1085;&#1100;, &#1090;&#1088;&#1077;&#1073;&#1091;&#1077;&#1090;&#1089;&#1103; &#1089;&#1086;&#1073;&#1088;&#1072;&#1090;&#1100; &#1074;&#1089;&#1077; &#1073;&#1088;&#1080;&#1083;&#1083;&#1080;&#1072;&#1085;&#1090;&#1099;, &#1088;&#1072;&#1089;&#1087;&#1086;&#1083;&#1086;&#1078;&#1077;&#1085;&#1085;&#1099;&#1077; &#1074; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1077;, &#1087;&#1086;&#1089;&#1083;&#1077; &#1095;&#1077;&#1075;&#1086; &#1087;&#1086;&#1103;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1082;&#1083;&#1102;&#1095;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1084; &#1084;&#1086;&#1078;&#1085;&#1086; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1100; &#1076;&#1074;&#1077;&#1088;&#1100; &#1085;&#1072; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1081; &#1091;&#1088;&#1086;&#1074;&#1077;&#1085;&#1100;. &#1042; &#1087;&#1088;&#1086;&#1093;&#1086;&#1078;&#1076;&#1077;&#1085;&#1080;&#1080; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1086;&#1074;, &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1084;&#1077;&#1096;&#1072;&#1102;&#1090; &#1088;&#1072;&#1079;&#1083;&#1080;&#1095;&#1085;&#1086;&#1075;&#1086; &#1074;&#1080;&#1076;&#1072; &#1084;&#1086;&#1085;&#1089;&#1090;&#1088;&#1099;, &#1089; &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1084;&#1080; &#1080;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1073;&#1086;&#1088;&#1086;&#1090;&#1100;&#1089;&#1103; &#1087;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1084;&#1077;&#1095;&#1077;&#1081;, &#1088;&#1072;&#1079;&#1073;&#1088;&#1086;&#1089;&#1072;&#1085;&#1085;&#1099;&#1093; &#1087;&#1086; &#1091;&#1088;&#1086;&#1074;&#1085;&#1102;. &#1046;&#1080;&#1079;&#1085;&#1080; &#1084;&#1086;&#1078;&#1085;&#1086; &#1074;&#1086;&#1089;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1080;&#1090;&#1100; &#1087;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1082;&#1091;&#1074;&#1096;&#1080;&#1085;&#1072; &#1089; &#1074;&#1086;&#1076;&#1086;&#1081;, &#1072; &#1085;&#1077;&#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1091;&#1095;&#1072;&#1089;&#1090;&#1082;&#1080; &#1087;&#1086;&#1083;&#1072; &#1084;&#1086;&#1078;&#1085;&#1086; &#1087;&#1088;&#1086;&#1073;&#1080;&#1074;&#1072;&#1090;&#1100; &#1087;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1082;&#1080;&#1088;&#1082;&#1080;.</rus>\n           <eng>Ivan Papanin, the well-known Polar researcher, discovered an ancient Egyptian pyramid lost in the Antarctic ice. When examining the pyramid, he fell down and found himself inside of it. You have to help Papanin to find the way out of this terrible maze. The object of the game is to collect all magic stones in the maze to get the key that opens the door to the next level. You can use a pick to make holes in the floor. Swords scattered on the level will help you to fight with monsters. Be careful, after some period of time the destroyed monsters reappear. If you need to restore your life power, drink some water  from a jar. But all these items can be used only once.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <playmobile productpage=\"http://www.playmobile.ru/games/arcade/Papanins_Quest\" cost=\"2$\"/>\n  \t\t   <nikita productpage=\"http://www.888x.ru/javagames/show.php?ng=2061&amp;actnum=1&amp;md=76\" cost=\"3\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"mobilechase\"  title=\"MOBILE CHASE\" year=\"2004\">\n        <all/>\n\t\t<racing/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1042;&#1099; &#1084;&#1080;&#1088;&#1085;&#1086; &#1086;&#1090;&#1076;&#1099;&#1093;&#1072;&#1083;&#1080; &#1085;&#1072; &#1086;&#1073;&#1086;&#1095;&#1080;&#1085;&#1077;, &#1089;&#1080;&#1076;&#1103; &#1074; &#1089;&#1074;&#1086;&#1077;&#1081; &#1087;&#1086;&#1083;&#1080;&#1094;&#1077;&#1081;&#1089;&#1082;&#1086;&#1081; &#1084;&#1072;&#1096;&#1080;&#1085;&#1077;, &#1082;&#1086;&#1075;&#1076;&#1072; &#1087;&#1086;&#1089;&#1090;&#1091;&#1087;&#1080;&#1083;&#1086; &#1089;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077; &#1086;&#1073; &#1086;&#1075;&#1088;&#1072;&#1073;&#1083;&#1077;&#1085;&#1080;&#1080; &#1073;&#1072;&#1085;&#1082;&#1072;. &#1042; &#1087;&#1086;&#1075;&#1086;&#1085;&#1102;!</rus>\n           <eng>You are a brave policeman who has received the message about a bank robbery. Your have to overtake the gangsters and stop their van.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1072;&#1075;&#1085;&#1072;&#1090;&#1100; &#1092;&#1091;&#1088;&#1075;&#1086;&#1085; &#1087;&#1088;&#1077;&#1089;&#1090;&#1091;&#1087;&#1085;&#1080;&#1082;&#1086;&#1074; &#1080; &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1103; &#1074; &#1085;&#1077;&#1075;&#1086;, &#1079;&#1072;&#1089;&#1090;&#1072;&#1074;&#1080;&#1090;&#1100; &#1077;&#1075;&#1086; &#1086;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1080;&#1090;&#1100;&#1089;&#1103;. &#1055;&#1088;&#1080; &#1101;&#1090;&#1086;&#1084; &#1085;&#1072;&#1076;&#1086; &#1086;&#1073;&#1098;&#1077;&#1079;&#1078;&#1072;&#1090;&#1100; &#1087;&#1088;&#1077;&#1087;&#1103;&#1090;&#1089;&#1090;&#1074;&#1080;&#1103; &#1085;&#1072; &#1076;&#1086;&#1088;&#1086;&#1075;&#1077; &#1080; &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1090;&#1100; &#1089;&#1090;&#1086;&#1083;&#1082;&#1085;&#1086;&#1074;&#1077;&#1085;&#1080;&#1103; &#1089; &#1076;&#1088;&#1091;&#1075;&#1080;&#1084;&#1080; &#1091;&#1095;&#1072;&#1089;&#1090;&#1085;&#1080;&#1082;&#1072;&#1084;&#1080; &#1076;&#1086;&#1088;&#1086;&#1078;&#1085;&#1086;&#1075;&#1086; &#1076;&#1074;&#1080;&#1078;&#1077;&#1085;&#1080;&#1103;. &#1058;&#1072;&#1082; &#1078;&#1077; &#1089;&#1083;&#1077;&#1076;&#1091;&#1077;&#1090; &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1090;&#1100; &#1083;&#1091;&#1078;, &#1090;&#1072;&#1082; &#1082;&#1072;&#1082; &#1086;&#1085;&#1080; &#1076;&#1077;&#1083;&#1072;&#1102;&#1090; &#1072;&#1074;&#1090;&#1086;&#1084;&#1086;&#1073;&#1080;&#1083;&#1100; &#1085;&#1077;&#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1084;&#1099;&#1084;. </rus>\n           <eng>You are a brave policeman who has received the message about a bank robbery. Your have to overtake the gangsters and stop their van.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <playmobile productpage=\"http://www.playmobile.ru/games/race/Mobile_Chase\" cost=\"3$\"/>\n  \t\t   <nikita productpage=\"http://www.888x.ru/javagames/show.php?ng=2060&amp;actnum=1&amp;md=76\" cost=\"3$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"caspianmonster\"  title=\"CASPIAN MONSTER\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1089;&#1077;&#1082;&#1088;&#1077;&#1090;&#1085;&#1099;&#1084; &#1089;&#1086;&#1074;&#1077;&#1090;&#1089;&#1082;&#1080;&#1084; &#1101;&#1082;&#1088;&#1072;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1086;&#1084;, &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1100; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072; &#1080; &#1085;&#1072;&#1081;&#1076;&#1080; &#1074;&#1099;&#1093;&#1086;&#1076; &#1089; &#1073;&#1072;&#1079;&#1099;.</rus>\n           <eng>You are a pilot of a secret soviet airfoil boat, which is armed with missiles and a quick-firer.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1058;&#1077;&#1088;&#1088;&#1086;&#1088;&#1080;&#1089;&#1090;&#1099; &#1087;&#1086;&#1093;&#1080;&#1090;&#1080;&#1083;&#1080; &#1089;&#1077;&#1082;&#1088;&#1077;&#1090;&#1085;&#1099;&#1081; &#1101;&#1082;&#1088;&#1072;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085; &#171;&#1050;&#1072;&#1089;&#1087;&#1080;&#1081;&#1089;&#1082;&#1080;&#1081; &#1084;&#1086;&#1085;&#1089;&#1090;&#1088;&#187;, &#1074;&#1086;&#1086;&#1088;&#1091;&#1078;&#1077;&#1085;&#1085;&#1099;&#1081; &#1089;&#1072;&#1084;&#1099;&#1084; &#1089;&#1086;&#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1085;&#1099;&#1084; &#1086;&#1088;&#1091;&#1078;&#1080;&#1077;&#1084;, &#1085;&#1086; &#1074;&#1072;&#1084; &#1091;&#1076;&#1072;&#1083;&#1086;&#1089;&#1100; &#1087;&#1088;&#1086;&#1085;&#1080;&#1082;&#1085;&#1091;&#1090;&#1100; &#1085;&#1072; &#1080;&#1093; &#1073;&#1072;&#1079;&#1091; &#1080; &#1091;&#1075;&#1085;&#1072;&#1090;&#1100; &#1101;&#1082;&#1088;&#1072;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;. &#1042;&#1072;&#1096;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1087;&#1088;&#1086;&#1081;&#1090;&#1080; &#1090;&#1088;&#1080; &#1091;&#1095;&#1072;&#1089;&#1090;&#1082;&#1072; &#1086;&#1090; &#1073;&#1072;&#1079;&#1099; &#1082; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1086;&#1084;&#1091; &#1084;&#1086;&#1088;&#1102;, &#1085;&#1072;&#1096;&#1087;&#1080;&#1075;&#1086;&#1074;&#1072;&#1085;&#1085;&#1099;&#1093; &#1074;&#1088;&#1072;&#1078;&#1077;&#1089;&#1082;&#1086;&#1081; &#1090;&#1077;&#1093;&#1085;&#1080;&#1082;&#1086;&#1081; &#1080; &#1084;&#1080;&#1085;&#1072;&#1084;&#1080;.&#1042;&#1086;&#1086;&#1088;&#1091;&#1078;&#1077;&#1085;&#1080;&#1077; &#1089;&#1086;&#1089;&#1090;&#1086;&#1080;&#1090; &#1080;&#1079; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1081; &#1087;&#1091;&#1096;&#1082;&#1080; &#1080; &#1076;&#1074;&#1091;&#1093; &#1074;&#1080;&#1076;&#1086;&#1074; &#1088;&#1072;&#1082;&#1077;&#1090;, &#1089;&#1072;&#1084;&#1086;&#1085;&#1072;&#1074;&#1086;&#1076;&#1103;&#1097;&#1080;&#1093;&#1089;&#1103; &#1080; &#1085;&#1077;&#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1084;&#1099;&#1093;. &#1057;&#1072;&#1084;&#1086;&#1085;&#1072;&#1074;&#1086;&#1076;&#1103;&#1097;&#1080;&#1077;&#1089;&#1103; &#1088;&#1072;&#1082;&#1077;&#1090;&#1099; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1074;&#1099;&#1073;&#1080;&#1088;&#1072;&#1102;&#1090; &#1094;&#1077;&#1083;&#1100; &#1080; &#1088;&#1072;&#1089;&#1089;&#1095;&#1080;&#1090;&#1099;&#1074;&#1072;&#1102;&#1090; &#1089;&#1074;&#1086;&#1102; &#1090;&#1088;&#1072;&#1077;&#1082;&#1090;&#1086;&#1088;&#1080;&#1102;, &#1072; &#1085;&#1077;&#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1084;&#1099;&#1077; &#1083;&#1077;&#1090;&#1103;&#1090; &#1087;&#1086; &#1082;&#1091;&#1088;&#1089;&#1091; &#1101;&#1082;&#1088;&#1072;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1072; &#1080; &#1086;&#1095;&#1077;&#1085;&#1100; &#1087;&#1086;&#1083;&#1077;&#1079;&#1085;&#1099; &#1076;&#1083;&#1103; &#1088;&#1072;&#1079;&#1088;&#1091;&#1096;&#1077;&#1085;&#1080;&#1103; &#1084;&#1086;&#1089;&#1090;&#1086;&#1074;.</rus>\n           <eng>You are a pilot of a secret soviet airfoil boat, which is armed with missiles and a quick-firer. Your main objective is to leave the enemy base destroying as much military equipment as possible.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <playmobile productpage=\"http://www.playmobile.ru/games/shooter/Caspian_monster\" cost=\"2$\"/>\n  \t\t   <nikita productpage=\"http://www.888x.ru/javagames/show.php?ng=2058&amp;actnum=1&amp;md=76\" cost=\"3$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n        </devices>\n\t</game>\n\n\t<game id=\"airaggression\"  title=\"AIR AGGRESSION\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"coldcore\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1085;&#1099;&#1077; &#1084;&#1086;&#1085;&#1089;&#1090;&#1088;&#1099; &#1074;&#1079;&#1103;&#1083;&#1080; &#1082;&#1086;&#1085;&#1090;&#1088;&#1086;&#1083;&#1100; &#1085;&#1072;&#1076; &#1079;&#1077;&#1084;&#1085;&#1099;&#1084;&#1080; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090;&#1072;&#1084;&#1080;, &#1089;&#1087;&#1072;&#1089;&#1080; &#1084;&#1080;&#1088;!</rus>\n           <eng>Eight alien monsters took control over all Earth's war-planes to enslave our planet.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1059; &#1079;&#1077;&#1084;&#1083;&#1103;&#1085; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1085;&#1072;&#1103; &#1085;&#1072;&#1087;&#1072;&#1089;&#1090;&#1100; &#8212; 8 &#1080;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1085;&#1099;&#1093; &#1084;&#1086;&#1085;&#1089;&#1090;&#1088;&#1086;&#1074; &#1079;&#1072;&#1093;&#1074;&#1072;&#1090;&#1080;&#1083;&#1080; &#1074;&#1083;&#1072;&#1089;&#1090;&#1100; &#1085;&#1072;&#1076; &#1074;&#1089;&#1077;&#1084;&#1080; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090;&#1072;&#1084;&#1080; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1099; &#1080; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1074;&#1072;&#1096; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090; &#1095;&#1091;&#1076;&#1086;&#1084; &#1080;&#1079;&#1073;&#1077;&#1078;&#1072;&#1083; &#1080;&#1093; &#1074;&#1083;&#1080;&#1103;&#1085;&#1080;&#1103;. &#1042;&#1072;&#1096;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1080;&#1090;&#1100; &#1074;&#1089;&#1077;&#1093; &#1074;&#1086;&#1089;&#1100;&#1084;&#1077;&#1088;&#1099;&#1093; &#1084;&#1086;&#1085;&#1089;&#1090;&#1088;&#1086;&#1074;, &#1087;&#1088;&#1080;&#1085;&#1103;&#1074;&#1096;&#1080;&#1093; &#1086;&#1073;&#1088;&#1072;&#1079;&#1099; &#1075;&#1080;&#1075;&#1072;&#1085;&#1090;&#1089;&#1082;&#1080;&#1093; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090;&#1086;&#1074;, &#1080; &#1074;&#1077;&#1088;&#1085;&#1091;&#1090;&#1100; &#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1077; &#1084;&#1080;&#1088; &#1080; &#1089;&#1087;&#1086;&#1082;&#1086;&#1081;&#1089;&#1090;&#1074;&#1080;&#1077;. &#1059;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1084;&#1072;&#1083;&#1077;&#1085;&#1100;&#1082;&#1080;&#1084; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090;&#1080;&#1082;&#1086;&#1084; &#1085;&#1072; &#1101;&#1082;&#1088;&#1072;&#1085;&#1077;, &#1089;&#1083;&#1077;&#1076;&#1091;&#1077;&#1090; &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1090;&#1100; &#1089;&#1090;&#1086;&#1083;&#1082;&#1085;&#1086;&#1074;&#1077;&#1085;&#1080;&#1103; &#1089; &#1076;&#1088;&#1091;&#1075;&#1080;&#1084;&#1080; &#1089;&#1072;&#1084;&#1086;&#1083;&#1077;&#1090;&#1072;&#1084;&#1080;, &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1090;&#1100; &#1087;&#1086;&#1087;&#1072;&#1076;&#1072;&#1085;&#1080;&#1081; &#1080; &#1073;&#1088;&#1072;&#1090;&#1100; &#1073;&#1086;&#1085;&#1091;&#1089;&#1099; &#1080; &#1086;&#1088;&#1091;&#1078;&#1080;&#1077;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1086;&#1077; &#1076;&#1086;&#1089;&#1090;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1086;&#1084; &#1087;&#1086;&#1076;&#1076;&#1077;&#1088;&#1078;&#1082;&#1080;. </rus>\n           <eng>Eight alien monsters took control over all Earth's war-planes to enslave our planet. You were able to keep one plane from being captured and now you have got a chance to keep mankind free.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t   <playmobile productpage=\"http://www.playmobile.ru/games/shooter/Air_Aggression\" cost=\"3$\"/>\n  \t\t   <nikita productpage=\"http://www.888x.ru/javagames/show.php?ng=2057&amp;actnum=1&amp;md=76\" cost=\"3$\"/>\n\t\t</sales>\n        \n        <devices>\n            <nokia family=\"series60dp1\"/>\n            <nokia family=\"series60dp2b\"/>\n        </devices>\n\t</game>\n\n    <game id=\"blazinggears\"  title=\"BLAZING GEARS\" year=\"2004\">\n        <all/>\n\t\t<racing/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1075;&#1086;&#1085;&#1086;&#1095;&#1085;&#1086;&#1081; &#1084;&#1072;&#1096;&#1080;&#1085;&#1086;&#1081;, &#1085;&#1072;&#1076;&#1086; &#1087;&#1086;&#1082;&#1072;&#1079;&#1072;&#1090;&#1100; &#1083;&#1091;&#1095;&#1096;&#1077;&#1077; &#1074;&#1088;&#1077;&#1084;&#1103;.</rus>\n           <eng>You are a driver of a sport car and your task is to pass loops for a limited time. You have to avoid collisions with other cars on the road.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1074;&#1086;&#1076;&#1080;&#1090;&#1077;&#1083;&#1100; &#1072;&#1074;&#1090;&#1086;&#1084;&#1072;&#1096;&#1080;&#1085;&#1099;, &#1091;&#1095;&#1072;&#1089;&#1090;&#1074;&#1091;&#1102;&#1097;&#1077;&#1081; &#1074; &#1075;&#1086;&#1085;&#1082;&#1072;&#1093; &#1073;&#1077;&#1079; &#1087;&#1088;&#1072;&#1074;&#1080;&#1083;. &#1053;&#1072; &#1087;&#1088;&#1086;&#1093;&#1086;&#1078;&#1076;&#1077;&#1085;&#1080;&#1077; &#1082;&#1072;&#1078;&#1076;&#1086;&#1075;&#1086; &#1101;&#1090;&#1072;&#1087;&#1072; &#1075;&#1086;&#1085;&#1086;&#1082; &#1074;&#1072;&#1084; &#1076;&#1072;&#1077;&#1090;&#1089;&#1103; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1085;&#1086;&#1077; &#1074;&#1088;&#1077;&#1084;&#1103;. &#1044;&#1074;&#1080;&#1075;&#1072;&#1081;&#1090;&#1077;&#1089;&#1100; &#1085;&#1072; &#1084;&#1072;&#1082;&#1089;&#1080;&#1084;&#1072;&#1083;&#1100;&#1085;&#1086;&#1081; &#1089;&#1082;&#1086;&#1088;&#1086;&#1089;&#1090;&#1080;, &#1085;&#1086; &#1087;&#1086;&#1089;&#1090;&#1072;&#1088;&#1072;&#1081;&#1090;&#1077;&#1089;&#1100; &#1085;&#1077; &#1089;&#1090;&#1072;&#1083;&#1082;&#1080;&#1074;&#1072;&#1090;&#1100;&#1089;&#1103; &#1089; &#1076;&#1088;&#1091;&#1075;&#1080;&#1084;&#1080; &#1084;&#1072;&#1096;&#1080;&#1085;&#1072;&#1084;&#1080;!</rus>\n           <eng>You are a driver of a sport car and your task is to pass loops for a limited time. You have to avoid collisions with other cars on the road.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"castleassault\"  title=\"CASTLE ASSAULT\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1053;&#1072;&#1076;&#1086; &#1088;&#1072;&#1079;&#1073;&#1080;&#1090;&#1100; &#1082;&#1088;&#1077;&#1087;&#1086;&#1089;&#1090;&#1085;&#1091;&#1102; &#1089;&#1090;&#1077;&#1085;&#1091;, &#1095;&#1090;&#1086; &#1073;&#1099; &#1079;&#1072;&#1093;&#1074;&#1072;&#1090;&#1080;&#1090;&#1100; &#1079;&#1072;&#1084;&#1086;&#1082;.</rus>\n           <eng>To break a castle wall by a catapult.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090;&#1077; &#1082;&#1072;&#1090;&#1072;&#1087;&#1091;&#1083;&#1100;&#1090;&#1086;&#1081; &#1080; &#1076;&#1086;&#1083;&#1078;&#1085;&#1099; &#1088;&#1072;&#1079;&#1088;&#1091;&#1096;&#1080;&#1090;&#1100; &#1076;&#1074;&#1072; &#1089;&#1086;&#1089;&#1077;&#1076;&#1085;&#1080;&#1093; &#1091;&#1095;&#1072;&#1089;&#1090;&#1082;&#1072; &#1089;&#1090;&#1077;&#1085;&#1099; &#1086;&#1089;&#1072;&#1078;&#1076;&#1077;&#1085;&#1085;&#1086;&#1075;&#1086; &#1079;&#1072;&#1084;&#1082;&#1072;. &#1044;&#1086;&#1078;&#1076;&#1080;&#1090;&#1077;&#1089;&#1100; &#1079;&#1072;&#1088;&#1103;&#1076;&#1082;&#1080; &#1082;&#1072;&#1090;&#1072;&#1087;&#1091;&#1083;&#1100;&#1090;&#1099; &#1080; &#1089;&#1083;&#1077;&#1076;&#1080;&#1090;&#1077; &#1079;&#1072; &#1091;&#1082;&#1072;&#1079;&#1072;&#1090;&#1077;&#1083;&#1077;&#1084; &#1074;&#1099;&#1089;&#1086;&#1090;&#1099; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;&#1080;&#1074;&#1072;&#1085;&#1080;&#1103;. &#1057;&#1090;&#1077;&#1085;&#1091; &#1084;&#1086;&#1078;&#1085;&#1086; &#1088;&#1072;&#1079;&#1088;&#1091;&#1096;&#1080;&#1090;&#1100; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1089;&#1074;&#1077;&#1088;&#1093;&#1091; &#1074;&#1085;&#1080;&#1079;. &#1053;&#1086; &#1073;&#1077;&#1088;&#1077;&#1075;&#1080;&#1090;&#1077;&#1089;&#1100; &#1074;&#1088;&#1072;&#1078;&#1077;&#1089;&#1082;&#1080;&#1093; &#1082;&#1072;&#1084;&#1085;&#1077;&#1081; &#1083;&#1077;&#1090;&#1103;&#1097;&#1080;&#1093; &#1080;&#1079;-&#1079;&#1072; &#1089;&#1090;&#1077;&#1085;&#1099;!</rus>\n           <eng>You are the commander of a catapult crew and your task is to destroy two vertical neighbor parts of the castle wall with a missile. The wall can be destroyed top-down only. Left altimeter shows current altitude of the missile. You have to be careful because the enemy throws its missiles over the wall. You can't fire until the catapult has been charged.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"cockroach\"  title=\"COCKROACH\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1090;&#1072;&#1088;&#1072;&#1082;&#1072;&#1085;&#1086;&#1084; &#1080; &#1087;&#1086;&#1076;&#1073;&#1080;&#1088;&#1072;&#1103; &#1088;&#1072;&#1079;&#1085;&#1099;&#1077; &#1089;&#1098;&#1077;&#1076;&#1086;&#1073;&#1085;&#1099;&#1077; &#1080; &#1085;&#1077;&#1089;&#1098;&#1077;&#1076;&#1086;&#1073;&#1085;&#1099;&#1077; &#1087;&#1088;&#1077;&#1076;&#1084;&#1077;&#1090;&#1099;, &#1085;&#1072;&#1076;&#1086; &#1085;&#1072;&#1081;&#1090;&#1080; &#1074;&#1099;&#1093;&#1086;&#1076; &#1080;&#1079; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1072;.</rus>\n           <eng>A cockroach have to find a way out of the maze</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082;  &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1090;&#1072;&#1088;&#1072;&#1082;&#1072;&#1085;&#1086;&#1084;, &#1087;&#1086;&#1083;&#1079;&#1072;&#1102;&#1097;&#1080;&#1084; &#1074; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1077; &#1080;&#1079; &#1090;&#1088;&#1091;&#1073; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1085;&#1072;&#1081;&#1090;&#1080; &#1074;&#1099;&#1093;&#1086;&#1076; &#1080;&#1079; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1072;. &#1042; &#1083;&#1072;&#1073;&#1080;&#1088;&#1080;&#1085;&#1090;&#1077; &#1088;&#1072;&#1079;&#1073;&#1088;&#1086;&#1089;&#1072;&#1085;&#1099; &#1088;&#1072;&#1079;&#1083;&#1080;&#1095;&#1085;&#1099;&#1077; &#1089;&#1098;&#1077;&#1076;&#1086;&#1073;&#1085;&#1099;&#1077; &#1087;&#1088;&#1077;&#1076;&#1084;&#1077;&#1090;&#1099;, &#1085;&#1077;&#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1090;&#1072;&#1088;&#1072;&#1082;&#1072;&#1085; &#1084;&#1086;&#1078;&#1077;&#1090; &#1077;&#1089;&#1090;&#1100; &#1073;&#1077;&#1079;&#1073;&#1086;&#1083;&#1077;&#1079;&#1085;&#1077;&#1085;&#1085;&#1086;, &#1085;&#1077;&#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1086;&#1090;&#1085;&#1080;&#1084;&#1072;&#1102;&#1090; &#1086;&#1095;&#1082;&#1080; &#1080; &#1074;&#1088;&#1077;&#1084;&#1103;.</rus>\n           <eng>You are driving a running cockroach in the maze and your task is as soon as possible to find a way out of the maze. There are a lot of scattered eatable things in the maze they increase and decrease game scores, so the game scores are decreased with time.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"coconutsfall\"  title=\"COCONUTS FALL\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1054;&#1073;&#1077;&#1079;&#1100;&#1103;&#1085;&#1072; &#1076;&#1086;&#1083;&#1078;&#1085;&#1072; &#1086;&#1090;&#1073;&#1080;&#1090;&#1100;&#1089;&#1103; &#1086;&#1090; &#1087;&#1088;&#1077;&#1089;&#1083;&#1077;&#1076;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1077;&#1081; &#1086;&#1088;&#1077;&#1093;&#1072;&#1084;&#1080;.</rus>\n           <eng>Save own freedom with coconuts.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1086;&#1073;&#1077;&#1079;&#1100;&#1103;&#1085;&#1086;&#1081;, &#1089;&#1087;&#1072;&#1089;&#1072;&#1102;&#1097;&#1077;&#1081;&#1089;&#1103; &#1085;&#1072; &#1074;&#1077;&#1088;&#1093;&#1091;&#1096;&#1082;&#1072;&#1093; &#1087;&#1072;&#1083;&#1100;&#1084; &#1086;&#1090; &#1082;&#1072;&#1088;&#1072;&#1073;&#1082;&#1072;&#1102;&#1097;&#1080;&#1093;&#1089;&#1103; &#1087;&#1086; &#1085;&#1080;&#1084; &#1095;&#1077;&#1083;&#1086;&#1074;&#1077;&#1095;&#1082;&#1086;&#1074;. &#1054;&#1073;&#1077;&#1079;&#1100;&#1103;&#1085;&#1072; &#1084;&#1086;&#1078;&#1077;&#1090; &#1073;&#1088;&#1086;&#1089;&#1072;&#1090;&#1100; &#1074; &#1095;&#1077;&#1083;&#1086;&#1074;&#1077;&#1095;&#1082;&#1086;&#1074; &#1089;&#1086;&#1073;&#1088;&#1072;&#1085;&#1085;&#1099;&#1077; &#1085;&#1072; &#1087;&#1072;&#1083;&#1100;&#1084;&#1072;&#1093; &#1082;&#1086;&#1082;&#1086;&#1089;&#1099; &#1080; &#1076;&#1086;&#1083;&#1078;&#1085;&#1072; &#1087;&#1088;&#1103;&#1090;&#1072;&#1090;&#1100;&#1089;&#1103; &#1086;&#1090; &#1087;&#1088;&#1086;&#1083;&#1077;&#1090;&#1072;&#1102;&#1097;&#1077;&#1075;&#1086; &#1085;&#1072;&#1076; &#1087;&#1072;&#1083;&#1100;&#1084;&#1072;&#1084;&#1080; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072;.</rus>\n           <eng>You are a monkey and hunters want to catch you. Your task is to save own freedom as long as possible. You can use coconuts to knock men and you have to be careful because a helicopter tries to catch you with a net.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"conecone\"  title=\"CONE! CONE!\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1059;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1073;&#1077;&#1083;&#1082;&#1086;&#1081;, &#1089;&#1086;&#1073;&#1077;&#1088;&#1080; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1086;&#1088;&#1077;&#1093;&#1086;&#1074; &#1080; &#1086;&#1090;&#1073;&#1077;&#1081;&#1089;&#1103; &#1086;&#1090; &#1074;&#1086;&#1088;&#1086;&#1085;.</rus>\n           <eng>You are a squirrel defending your supplies against crows.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1073;&#1077;&#1083;&#1082;&#1086;&#1081;, &#1079;&#1072;&#1097;&#1080;&#1097;&#1072;&#1102;&#1097;&#1077;&#1081; &#1086;&#1090; &#1074;&#1086;&#1088;&#1086;&#1085; &#1089;&#1087;&#1088;&#1103;&#1090;&#1072;&#1085;&#1085;&#1099;&#1077; &#1074; &#1076;&#1091;&#1087;&#1083;&#1072;&#1093; &#1076;&#1077;&#1088;&#1077;&#1074;&#1072; &#1079;&#1072;&#1087;&#1072;&#1089;&#1099;. &#1041;&#1077;&#1083;&#1082;&#1072; &#1087;&#1088;&#1099;&#1075;&#1072;&#1077;&#1090; &#1087;&#1086; &#1074;&#1077;&#1090;&#1074;&#1103;&#1084;, &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1077;&#1090; &#1096;&#1080;&#1096;&#1082;&#1080; &#1080; &#1073;&#1088;&#1086;&#1089;&#1072;&#1077;&#1090; &#1080;&#1093; &#1087;&#1086; &#1074;&#1086;&#1088;&#1086;&#1085;&#1072;&#1084;, &#1089;&#1072;&#1076;&#1103;&#1097;&#1080;&#1084;&#1089;&#1103; &#1085;&#1072; &#1074;&#1077;&#1090;&#1074;&#1080;.</rus>\n           <eng>You are a squirrel defending your supplies against crows. You can throw cones at them but be careful because you should keep a distance from a crow.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"firingline\"  title=\"FIRING LINE\" year=\"2004\">\n        <all/>\n\t\t<shooter/>\n\t    \n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1054;&#1085;&#1080; &#1087;&#1088;&#1080;&#1093;&#1086;&#1076;&#1103;&#1090; &#1087;&#1088;&#1103;&#1084;&#1086; &#1080;&#1079; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1086;&#1075;&#1086; &#1082;&#1086;&#1089;&#1084;&#1086;&#1089;&#1072;, &#1072; &#1091; &#1090;&#1077;&#1073;&#1103; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1073;&#1083;&#1072;&#1089;&#1090;&#1077;&#1088;...</rus>\n           <eng>You are the defender of the docking tunnel of your spaceship from space creatures.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; - &#1079;&#1072;&#1097;&#1080;&#1090;&#1085;&#1080;&#1082; &#1089;&#1090;&#1099;&#1082;&#1086;&#1074;&#1086;&#1095;&#1085;&#1086;&#1075;&#1086; &#1096;&#1083;&#1102;&#1079;&#1072;, &#1074; &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1083;&#1077;&#1079;&#1091;&#1090; &#1080;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1085;&#1099;&#1077; &#1090;&#1074;&#1072;&#1088;&#1080;. &#1047;&#1072;&#1076;&#1072;&#1095;&#1072; - &#1085;&#1072;&#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1090;&#1074;&#1072;&#1088;&#1077;&#1081;, &#1087;&#1088;&#1077;&#1078;&#1076;&#1077; &#1095;&#1077;&#1084; &#1080;&#1093; &#1087;&#1086;&#1090;&#1086;&#1082; &#1079;&#1072;&#1093;&#1083;&#1077;&#1089;&#1090;&#1085;&#1077;&#1090; &#1089;&#1090;&#1072;&#1085;&#1094;&#1080;&#1102;.</rus>\n           <eng>You are the defender of the docking tunnel of your spaceship from space creatures. Don&#8217;t allow them to approach to you! Fire! Fire!</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"fisher\"  title=\"FISHER\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1055;&#1086;&#1073;&#1077;&#1076;&#1080; &#1074; &#1095;&#1077;&#1084;&#1087;&#1080;&#1086;&#1085;&#1072;&#1090;&#1077; &#1087;&#1086; &#1088;&#1099;&#1073;&#1086;&#1083;&#1086;&#1074;&#1089;&#1090;&#1074;&#1091;, &#1085;&#1086; &#1087;&#1086;&#1084;&#1085;&#1080; &#1095;&#1090;&#1086; &#1082;&#1088;&#1102;&#1095;&#1082;&#1086;&#1074; &#1084;&#1072;&#1083;&#1086;, &#1072; &#1072;&#1082;&#1091;&#1083; &#1084;&#1085;&#1086;&#1075;&#1086;...</rus>\n           <eng>You are a fisher and have to catch as many as possible fishes.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1088;&#1099;&#1073;&#1072;&#1082;&#1072; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1085;&#1072;&#1083;&#1086;&#1074;&#1080;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1088;&#1099;&#1073;&#1099; &#1087;&#1088;&#1080; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1085;&#1086;&#1084; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1077; &#1082;&#1088;&#1102;&#1095;&#1082;&#1086;&#1074; (&#1080;&#1075;&#1088;&#1086;&#1074;&#1099;&#1093; &#1087;&#1086;&#1087;&#1099;&#1090;&#1086;&#1082;). &#1042; &#1074;&#1086;&#1076;&#1077; &#1087;&#1083;&#1072;&#1074;&#1072;&#1102;&#1090; &#1088;&#1099;&#1073;&#1099;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1093; &#1084;&#1086;&#1078;&#1085;&#1086; &#1083;&#1086;&#1074;&#1080;&#1090;&#1100; &#1080; &#1093;&#1080;&#1097;&#1085;&#1080;&#1082;&#1080;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1084;&#1086;&#1075;&#1091;&#1090; &#1087;&#1077;&#1088;&#1077;&#1082;&#1091;&#1089;&#1099;&#1074;&#1072;&#1090;&#1100; &#1083;&#1077;&#1089;&#1082;&#1091;, &#1087;&#1088;&#1080; &#1101;&#1090;&#1086;&#1084; &#1080;&#1075;&#1088;&#1086;&#1082; &#1090;&#1077;&#1088;&#1103;&#1077;&#1090; &#1086;&#1076;&#1085;&#1091; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1091;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1090;&#1100; &#1075;&#1083;&#1091;&#1073;&#1080;&#1085;&#1086;&#1081; &#1087;&#1086;&#1075;&#1088;&#1091;&#1078;&#1077;&#1085;&#1080;&#1103; &#1082;&#1088;&#1102;&#1095;&#1082;&#1072;, &#1088;&#1072;&#1079;&#1084;&#1072;&#1090;&#1099;&#1074;&#1072;&#1103; &#1083;&#1077;&#1089;&#1082;&#1091; &#1080;&#1083;&#1080; &#1087;&#1086;&#1076;&#1085;&#1080;&#1084;&#1072;&#1103; &#1091;&#1076;&#1086;&#1095;&#1082;&#1091;.</rus>\n           <eng>You are a fisher and have to catch as many as possible fishes. Take care of big predatory fishes, they break your fishing-line.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"hardday\"  title=\"HARD DAY\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1058;&#1103;&#1078;&#1077;&#1083;&#1072; &#1088;&#1072;&#1073;&#1086;&#1090;&#1072; &#1082;&#1091;&#1088;&#1100;&#1077;&#1088;&#1072; &#1074; &#1086;&#1092;&#1080;&#1089;&#1077;, &#1085;&#1086; &#1042;&#1099; &#1085;&#1077; &#1073;&#1086;&#1080;&#1090;&#1077;&#1089;&#1100; &#1090;&#1103;&#1078;&#1077;&#1083;&#1086;&#1081; &#1088;&#1072;&#1073;&#1086;&#1090;&#1099;...</rus>\n           <eng>You are a courier in a big company and your task is to deliver documents inside of an office.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090;&#1077; &#1082;&#1091;&#1088;&#1100;&#1077;&#1088;&#1086;&#1084;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1076;&#1086;&#1089;&#1090;&#1072;&#1074;&#1083;&#1103;&#1090;&#1100; &#1076;&#1086;&#1082;&#1091;&#1084;&#1077;&#1085;&#1090;&#1099; &#1074;&#1085;&#1091;&#1090;&#1088;&#1080; &#1086;&#1092;&#1080;&#1089;&#1072;. &#1042;&#1089;&#1077; &#1073;&#1077;&#1083;&#1099;&#1077; &#1087;&#1072;&#1087;&#1082;&#1080; &#1076;&#1086;&#1083;&#1078;&#1085;&#1099; &#1073;&#1099;&#1090;&#1100; &#1076;&#1086;&#1089;&#1090;&#1072;&#1074;&#1083;&#1077;&#1085;&#1099; &#1085;&#1077;&#1090;&#1077;&#1088;&#1087;&#1077;&#1083;&#1080;&#1074;&#1099;&#1084; &#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1090;&#1077;&#1083;&#1103;&#1084; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1099;&#1089;&#1090;&#1088;&#1077;&#1077;. &#1055;&#1086;&#1084;&#1085;&#1080;&#1090;&#1077;, &#1074;&#1072;&#1096; &#1076;&#1080;&#1088;&#1077;&#1082;&#1090;&#1086;&#1088; &#1073;&#1091;&#1076;&#1077;&#1090; &#1086;&#1095;&#1077;&#1085;&#1100; &#1079;&#1086;&#1083;, &#1077;&#1089;&#1083;&#1080; &#1074;&#1089;&#1090;&#1088;&#1077;&#1090;&#1080;&#1090; &#1074;&#1072;&#1089; &#1096;&#1072;&#1090;&#1072;&#1102;&#1097;&#1080;&#1084;&#1089;&#1103; &#1073;&#1077;&#1079; &#1076;&#1077;&#1083;&#1072;!</rus>\n           <eng>You are a courier in a big company and your task is to deliver documents inside of an office. All white folders must be delivered to recipients as soon as possible. Remember, your manager will be very angry if meet you without a folder.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"hunt\"  title=\"HUNT\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1047;&#1074;&#1077;&#1088;&#1077;&#1081; &#1074; &#1083;&#1077;&#1089;&#1091; &#1084;&#1085;&#1086;&#1075;&#1086;, &#1072; &#1087;&#1072;&#1090;&#1088;&#1086;&#1085;&#1086;&#1074; &#1084;&#1072;&#1083;&#1086;.. &#1090;&#1088;&#1072;&#1090;&#1100; &#1080;&#1093; &#1089; &#1090;&#1086;&#1083;&#1082;&#1086;&#1084;.</rus>\n           <eng>You are a brave hunter and your task is to kill as many as possible animals by 20 bullets.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1086;&#1093;&#1086;&#1090;&#1085;&#1080;&#1082;&#1072; &#1080;  &#1074; &#1085;&#1072;&#1095;&#1072;&#1083;&#1077; &#1080;&#1075;&#1088;&#1099; &#1077;&#1084;&#1091; &#1076;&#1072;&#1077;&#1090;&#1089;&#1103; 20 &#1087;&#1072;&#1090;&#1088;&#1086;&#1085;&#1086;&#1074;. &#1054;&#1085; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1072;&#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1099;&#1093;. &#1055;&#1088;&#1080; &#1087;&#1088;&#1086;&#1087;&#1091;&#1089;&#1082;&#1077; &#1073;&#1077;&#1079; &#1077;&#1076;&#1080;&#1085;&#1086;&#1075;&#1086; &#1074;&#1099;&#1089;&#1090;&#1088;&#1077;&#1083;&#1072; 20 &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1099;&#1093;, &#1091; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1089;&#1085;&#1080;&#1084;&#1072;&#1077;&#1090;&#1089;&#1103; &#1086;&#1076;&#1080;&#1085; &#1087;&#1072;&#1090;&#1088;&#1086;&#1085;. &#1063;&#1072;&#1089;&#1090;&#1086;&#1090;&#1072; &#1087;&#1086;&#1103;&#1074;&#1083;&#1077;&#1085;&#1080;&#1103; &#1079;&#1074;&#1077;&#1088;&#1077;&#1081; &#1085;&#1072; &#1101;&#1082;&#1088;&#1072;&#1085;&#1077; &#1074;&#1086;&#1079;&#1088;&#1072;&#1089;&#1090;&#1072;&#1077;&#1090; &#1089; &#1090;&#1077;&#1095;&#1077;&#1085;&#1080;&#1077;&#1084; &#1080;&#1075;&#1088;&#1086;&#1074;&#1086;&#1075;&#1086; &#1087;&#1088;&#1086;&#1094;&#1077;&#1089;&#1089;&#1072;. &#1047;&#1072; &#1082;&#1072;&#1078;&#1076;&#1086;&#1077; &#1091;&#1073;&#1080;&#1090;&#1086;&#1077; &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1086;&#1077;, &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1085;&#1072;&#1095;&#1080;&#1089;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1086;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1077;&#1085;&#1085;&#1086;&#1077; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1086; &#1080;&#1075;&#1088;&#1086;&#1074;&#1099;&#1093; &#1086;&#1095;&#1082;&#1086;&#1074;. &#1055;&#1088;&#1080; &#1085;&#1072;&#1074;&#1077;&#1076;&#1077;&#1085;&#1080;&#1080; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;&#1072; &#1085;&#1072; &#1073;&#1077;&#1075;&#1091;&#1097;&#1077;&#1077; &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1086;&#1077;, &#1086;&#1085;&#1086; &#1086;&#1089;&#1090;&#1072;&#1085;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; (&#1082;&#1088;&#1086;&#1084;&#1077; &#1074;&#1086;&#1088;&#1086;&#1085;&#1099;) &#1080; &#1086;&#1090;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; &#1072;&#1085;&#1080;&#1084;&#1072;&#1094;&#1080;&#1103; &#1089;&#1090;&#1088;&#1072;&#1093;&#1072;, &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1086;&#1077; &#1089;&#1090;&#1086;&#1080;&#1090; &#1087;&#1086;&#1076; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;&#1086;&#1084;, &#1087;&#1086;&#1082;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082; &#1085;&#1077; &#1074;&#1099;&#1089;&#1090;&#1088;&#1077;&#1083;&#1080;&#1090; &#1080;&#1083;&#1080; &#1085;&#1077; &#1091;&#1073;&#1077;&#1088;&#1077;&#1090; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;.</rus>\n           <eng>You are a brave hunter and your task is to kill as many as possible animals by 20 bullets. If you have missed 20 animals, one your bullet will be removed.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n    <game id=\"ironstream\"  title=\"IRON STREAM\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1042;&#1085;&#1080;&#1084;&#1072;&#1085;&#1080;&#1077;! &#1042;&#1085;&#1080;&#1084;&#1072;&#1085;&#1080;&#1077;! &#1042;&#1088;&#1072;&#1075; &#1087;&#1088;&#1086;&#1088;&#1074;&#1072;&#1083; &#1085;&#1072;&#1096;&#1091; &#1086;&#1073;&#1086;&#1088;&#1086;&#1085;&#1091; &#1080; &#1074;&#1093;&#1086;&#1076;&#1080;&#1090; &#1074; &#1085;&#1072;&#1089;&#1077;&#1083;&#1077;&#1085;&#1085;&#1099;&#1081; &#1088;&#1072;&#1081;&#1086;&#1085;! &#1042;&#1072;&#1096; &#1090;&#1072;&#1085;&#1082; - &#1077;&#1076;&#1080;&#1085;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1072;&#1103; &#1085;&#1072;&#1096;&#1072; &#1085;&#1072;&#1076;&#1077;&#1078;&#1076;&#1072;!</rus>\n           <eng>Warning! Warning! The enemy has dashed our protection line and marching into a populated area!</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1085;&#1080;&#1084;&#1072;&#1085;&#1080;&#1077;! &#1042;&#1085;&#1080;&#1084;&#1072;&#1085;&#1080;&#1077;! &#1042;&#1088;&#1072;&#1075; &#1087;&#1088;&#1086;&#1088;&#1074;&#1072;&#1083; &#1085;&#1072;&#1096;&#1091; &#1086;&#1073;&#1086;&#1088;&#1086;&#1085;&#1091; &#1080; &#1074;&#1093;&#1086;&#1076;&#1080;&#1090; &#1074; &#1085;&#1072;&#1089;&#1077;&#1083;&#1077;&#1085;&#1085;&#1099;&#1081; &#1088;&#1072;&#1081;&#1086;&#1085;! &#1042;&#1072;&#1096; &#1090;&#1072;&#1085;&#1082; &#1077;&#1076;&#1080;&#1085;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1072;&#1103; &#1085;&#1072;&#1096;&#1072; &#1085;&#1072;&#1076;&#1077;&#1078;&#1076;&#1072; &#1074; &#1101;&#1090;&#1086;&#1084; &#1088;&#1072;&#1081;&#1086;&#1085;&#1077; &#1080; &#1042;&#1072;&#1096;&#1072; &#1089;&#1074;&#1103;&#1090;&#1072;&#1103; &#1086;&#1073;&#1103;&#1079;&#1072;&#1085;&#1085;&#1086;&#1089;&#1090;&#1100; &#1079;&#1072;&#1097;&#1080;&#1090;&#1080;&#1090;&#1100; &#1077;&#1075;&#1086;. &#1042;&#1099; &#1076;&#1086;&#1083;&#1078;&#1085;&#1099; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1080;&#1090;&#1100;, &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1074;&#1088;&#1072;&#1078;&#1077;&#1089;&#1082;&#1080;&#1093; &#1090;&#1072;&#1085;&#1082;&#1086;&#1074;, &#1085;&#1086; &#1087;&#1088;&#1080; &#1101;&#1090;&#1086;&#1084; &#1089;&#1086;&#1093;&#1088;&#1072;&#1085;&#1080;&#1090;&#1100; &#1074; &#1094;&#1077;&#1083;&#1086;&#1089;&#1090;&#1080; &#1087;&#1086;&#1089;&#1090;&#1088;&#1086;&#1081;&#1082;&#1080;.</rus>\n           <eng>Warning! Warning! The enemy has dashed our protection line and marching into a populated area! Your tank is our only hope in the area and your duty is to defend it. You have to destroy as many enemy tanks as possible but keep buildings untouched.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"kickkick\"  title=\"KICK! KICK!\" year=\"2004\">\n        <all/>\n\t\t<sport/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1090;&#1088;&#1077;&#1084;&#1103; &#1092;&#1091;&#1090;&#1073;&#1086;&#1083;&#1080;&#1089;&#1090;&#1072;&#1084;&#1080;, &#1079;&#1072;&#1082;&#1088;&#1077;&#1087;&#1083;&#1077;&#1085;&#1085;&#1099;&#1084;&#1080; &#1085;&#1072; &#1086;&#1076;&#1085;&#1086;&#1084; &#1074;&#1088;&#1072;&#1097;&#1072;&#1102;&#1097;&#1077;&#1084;&#1089;&#1103; &#1089;&#1090;&#1077;&#1088;&#1078;&#1085;&#1077;.</rus>\n           <eng>You drive footballers fixed on a pivot.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1072; &#1087;&#1086; &#1084;&#1086;&#1090;&#1080;&#1074;&#1072;&#1084; &#1085;&#1072;&#1089;&#1090;&#1086;&#1083;&#1100;&#1085;&#1086;&#1081; &#1080;&#1075;&#1088;&#1099;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1090;&#1088;&#1077;&#1084;&#1103; &#1092;&#1091;&#1090;&#1073;&#1086;&#1083;&#1080;&#1089;&#1090;&#1072;&#1084;&#1080;, &#1079;&#1072;&#1082;&#1088;&#1077;&#1087;&#1083;&#1077;&#1085;&#1085;&#1099;&#1084;&#1080; &#1085;&#1072; &#1086;&#1076;&#1085;&#1086;&#1084; &#1074;&#1088;&#1072;&#1097;&#1072;&#1102;&#1097;&#1077;&#1084;&#1089;&#1103; &#1089;&#1090;&#1077;&#1088;&#1078;&#1085;&#1077;.  &#1053;&#1077;&#1086;&#1073;&#1093;&#1086;&#1076;&#1080;&#1084;&#1086; &#1087;&#1088;&#1086;&#1073;&#1080;&#1090;&#1100; &#1079;&#1072;&#1097;&#1080;&#1090;&#1091; &#1089;&#1086;&#1087;&#1077;&#1088;&#1085;&#1080;&#1082;&#1072; &#1080; &#1079;&#1072;&#1073;&#1080;&#1090;&#1100; &#1084;&#1103;&#1095; &#1074; &#1077;&#1075;&#1086; &#1074;&#1086;&#1088;&#1086;&#1090;&#1072;.</rus>\n           <eng>You drive footballers fixed on a pivot. Your task is to defend own goal and to kick as many balls as possible into the opponent&#8217;s goal.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"lifesaver\"  title=\"LIFESAVER\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1054;&#1075;&#1086;&#1085;&#1100; &#1087;&#1077;&#1088;&#1077;&#1082;&#1088;&#1099;&#1083; &#1074;&#1099;&#1093;&#1086;&#1076;&#1099; &#1080; &#1078;&#1080;&#1090;&#1077;&#1083;&#1080; &#1087;&#1088;&#1099;&#1075;&#1072;&#1102;&#1090; &#1080;&#1079; &#1075;&#1086;&#1088;&#1103;&#1097;&#1080;&#1093; &#1086;&#1082;&#1086;&#1085;, &#1089;&#1087;&#1072;&#1089;&#1080; &#1080;&#1093;!</rus>\n           <eng>Fire! Fire! Fire has occupied the ground level!</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1088;&#1091;&#1082;&#1086;&#1074;&#1086;&#1076;&#1080;&#1090;&#1077;&#1083;&#1103; &#1087;&#1086;&#1078;&#1072;&#1088;&#1085;&#1086;&#1081; &#1082;&#1086;&#1084;&#1072;&#1085;&#1076;&#1099; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1089;&#1087;&#1072;&#1089;&#1090;&#1080; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1078;&#1080;&#1090;&#1077;&#1083;&#1077;&#1081; &#1080;&#1079; &#1075;&#1086;&#1088;&#1103;&#1097;&#1077;&#1075;&#1086; &#1076;&#1086;&#1084;&#1072;. &#1048;&#1079;&#1085;&#1072;&#1095;&#1072;&#1083;&#1100;&#1085;&#1086; &#1075;&#1086;&#1088;&#1080;&#1090; &#1087;&#1077;&#1088;&#1074;&#1099;&#1081; &#1101;&#1090;&#1072;&#1078; &#1076;&#1086;&#1084;&#1072;, &#1089; &#1090;&#1077;&#1095;&#1077;&#1085;&#1080;&#1077;&#1084; &#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1080; &#1086;&#1075;&#1086;&#1085;&#1100; &#1086;&#1093;&#1074;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1090; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1077; &#1101;&#1090;&#1072;&#1078;&#1080; &#1079;&#1076;&#1072;&#1085;&#1080;&#1103;, &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1087;&#1086;&#1078;&#1072;&#1088;&#1085;&#1080;&#1082;&#1072;&#1084;&#1080;, &#1080;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1090;&#1091;&#1096;&#1080;&#1090;&#1100; &#1101;&#1090;&#1072;&#1078;&#1080;, &#1080;&#1089;&#1082;&#1083;&#1102;&#1095;&#1072;&#1103; &#1087;&#1077;&#1088;&#1074;&#1099;&#1081;. &#1057; &#1087;&#1086;&#1089;&#1083;&#1077;&#1076;&#1085;&#1077;&#1075;&#1086; &#1101;&#1090;&#1072;&#1078;&#1072; &#1087;&#1088;&#1099;&#1075;&#1072;&#1102;&#1090; &#1083;&#1102;&#1076;&#1080; &#1080; &#1080;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085;, &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1103; &#1087;&#1086;&#1078;&#1072;&#1088;&#1085;&#1099;&#1084;&#1080;, &#1091;&#1089;&#1087;&#1077;&#1074;&#1072;&#1090;&#1100; &#1083;&#1086;&#1074;&#1080;&#1090;&#1100; &#1080;&#1093; &#1085;&#1072; &#1073;&#1088;&#1077;&#1079;&#1077;&#1085;&#1090;. &#1055;&#1088;&#1080; &#1089;&#1084;&#1077;&#1088;&#1090;&#1080; &#1086;&#1076;&#1085;&#1086;&#1075;&#1086; &#1087;&#1088;&#1099;&#1075;&#1085;&#1091;&#1074;&#1096;&#1077;&#1075;&#1086;, &#1089;&#1085;&#1080;&#1084;&#1072;&#1077;&#1090;&#1089;&#1103; &#1086;&#1076;&#1085;&#1072; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072; &#1080;&#1075;&#1088;&#1072;&#1102;&#1097;&#1077;&#1075;&#1086;, &#1090;&#1072;&#1082; &#1078;&#1077; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072; &#1089;&#1085;&#1080;&#1084;&#1072;&#1077;&#1090;&#1089;&#1103; &#1087;&#1088;&#1080; &#1087;&#1086;&#1083;&#1085;&#1086;&#1084; &#1089;&#1075;&#1086;&#1088;&#1072;&#1085;&#1080;&#1080; &#1079;&#1076;&#1072;&#1085;&#1080;&#1103;.</rus>\n           <eng>Fire! Fire! Fire has occupied the ground level! You are the chief of a fire brigade and must not let the fire to occupy all building; you can use a water cannon. Hopeless men jump from windows and you have to catch them.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"livebridge\"  title=\"LIVE BRIDGE\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1057;&#1088;&#1086;&#1095;&#1085;&#1072;&#1103; &#1087;&#1086;&#1089;&#1099;&#1083;&#1082;&#1072;, &#1085;&#1086; &#1084;&#1086;&#1089;&#1090; &#1091;&#1078;&#1077; &#1074;&#1090;&#1086;&#1088;&#1091;&#1102; &#1087;&#1103;&#1090;&#1080;&#1083;&#1077;&#1090;&#1082;&#1091; &#1074; &#1088;&#1077;&#1084;&#1086;&#1085;&#1090;&#1077;. &#1055;&#1088;&#1080;&#1076;&#1077;&#1090;&#1089;&#1103; &#1074;&#1086;&#1089;&#1087;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1090;&#1100;&#1089;&#1103; &#1095;&#1077;&#1088;&#1077;&#1087;&#1072;&#1093;&#1072;&#1084;&#1080;...</rus>\n           <eng>You are a porter and your task is to carry cargo from the left riverside to the right riverside.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1085;&#1086;&#1089;&#1080;&#1083;&#1100;&#1097;&#1080;&#1082;&#1086;&#1084;, &#1087;&#1077;&#1088;&#1077;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1102;&#1097;&#1080;&#1084; &#1095;&#1077;&#1088;&#1077;&#1079; &#1088;&#1077;&#1082;&#1091; &#1075;&#1088;&#1091;&#1079;&#1099;. &#1063;&#1077;&#1088;&#1077;&#1079; &#1088;&#1077;&#1082;&#1091; &#1084;&#1086;&#1078;&#1085;&#1086; &#1087;&#1077;&#1088;&#1077;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100;&#1089;&#1103; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1087;&#1086; &#1087;&#1083;&#1072;&#1074;&#1072;&#1102;&#1097;&#1080;&#1084; &#1074; &#1085;&#1077;&#1081; &#1095;&#1077;&#1088;&#1077;&#1087;&#1072;&#1093;&#1072;&#1084;, &#1085;&#1099;&#1088;&#1103;&#1102;&#1097;&#1080;&#1084; &#1074;&#1088;&#1077;&#1084;&#1103; &#1086;&#1090; &#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1080; &#1079;&#1072; &#1088;&#1099;&#1073;&#1082;&#1072;&#1084;&#1080;, &#1074;&#1089;&#1087;&#1083;&#1099;&#1074;&#1072;&#1102;&#1097;&#1080;&#1084;&#1080; &#1089;&#1086; &#1076;&#1085;&#1072;.</rus>\n           <eng>You are a porter and your task is to carry cargo from the left riverside to the right riverside but there is not any bridge on the river so you use turtles as a live bridge. Unfortunately it is dangerous to use turtles as a bridge because they catch fishes and dive in the depth from time to time.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"nimble\"  title=\"NIMBLE\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1088;&#1072;&#1073;&#1086;&#1095;&#1080;&#1084;  &#1074; &#1072;&#1101;&#1088;&#1086;&#1087;&#1086;&#1088;&#1090;&#1091;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1088;&#1072;&#1079;&#1086;&#1073;&#1088;&#1072;&#1090;&#1100; &#1087;&#1077;&#1088;&#1077;&#1087;&#1091;&#1090;&#1072;&#1085;&#1085;&#1099;&#1081; &#1073;&#1072;&#1075;&#1072;&#1078; &#1085;&#1072; &#1083;&#1077;&#1085;&#1090;&#1072;&#1093; &#1090;&#1088;&#1072;&#1085;&#1089;&#1087;&#1086;&#1088;&#1090;&#1077;&#1088;&#1072;.</rus>\n           <eng>You are an airport loader and your task is to sort baggage.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1088;&#1072;&#1073;&#1086;&#1095;&#1080;&#1084;  &#1074; &#1072;&#1101;&#1088;&#1086;&#1087;&#1086;&#1088;&#1090;&#1091;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1088;&#1072;&#1079;&#1086;&#1073;&#1088;&#1072;&#1090;&#1100; &#1087;&#1077;&#1088;&#1077;&#1087;&#1091;&#1090;&#1072;&#1085;&#1085;&#1099;&#1081; &#1073;&#1072;&#1075;&#1072;&#1078; &#1085;&#1072; &#1083;&#1077;&#1085;&#1090;&#1072;&#1093; &#1090;&#1088;&#1072;&#1085;&#1089;&#1087;&#1086;&#1088;&#1090;&#1077;&#1088;&#1072; &#1076;&#1086; &#1090;&#1086;&#1075;&#1086; &#1082;&#1072;&#1082; &#1090;&#1088;&#1072;&#1085;&#1089;&#1087;&#1086;&#1088;&#1090;&#1077;&#1088;&#1099; &#1087;&#1077;&#1088;&#1077;&#1087;&#1086;&#1083;&#1085;&#1103;&#1090;&#1089;&#1103;.</rus>\n           <eng>You are an airport loader and your task is to sort baggage. You have to take color bags and place them on the conveyer having the same color as the bag. Bags should not overload conveyers.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"opthunderclap\"  title=\"OPERATION THUNDERCLAP\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1087;&#1080;&#1083;&#1086;&#1090;&#1072; &#1073;&#1086;&#1077;&#1074;&#1086;&#1075;&#1086; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072;, &#1074; &#1079;&#1072;&#1076;&#1072;&#1095;&#1091; &#1082;&#1086;&#1090;&#1086;&#1088;&#1086;&#1075;&#1086; &#1074;&#1093;&#1086;&#1076;&#1080;&#1090; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077;&#1075;&#1086; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1072; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1086;&#1074; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;.</rus>\n           <eng>You are a pilot of a military copter and your task is to kill as many as possible enemy copters.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1087;&#1080;&#1083;&#1086;&#1090;&#1072; &#1073;&#1086;&#1077;&#1074;&#1086;&#1075;&#1086; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072;, &#1074; &#1079;&#1072;&#1076;&#1072;&#1095;&#1091; &#1082;&#1086;&#1090;&#1086;&#1088;&#1086;&#1075;&#1086; &#1074;&#1093;&#1086;&#1076;&#1080;&#1090; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077;&#1075;&#1086; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1072; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1086;&#1074; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072;. &#1042;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1099; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072; &#1089;&#1083;&#1091;&#1095;&#1072;&#1081;&#1085;&#1099;&#1084; &#1086;&#1073;&#1088;&#1072;&#1079;&#1086;&#1084; &#1087;&#1086;&#1103;&#1074;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1085;&#1072; &#1101;&#1082;&#1088;&#1072;&#1085;&#1077; &#1080; &#1087;&#1077;&#1088;&#1077;&#1084;&#1077;&#1097;&#1072;&#1102;&#1090;&#1089;&#1103; &#1087;&#1086; &#1088;&#1072;&#1079;&#1083;&#1080;&#1095;&#1085;&#1099;&#1084; &#1090;&#1088;&#1072;&#1077;&#1082;&#1090;&#1086;&#1088;&#1080;&#1103;&#1084;. &#1059;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090;&#1072; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072; &#1086;&#1089;&#1091;&#1097;&#1077;&#1089;&#1090;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1087;&#1091;&#1090;&#1077;&#1084; &#1085;&#1072;&#1074;&#1077;&#1076;&#1077;&#1085;&#1080;&#1103; &#1085;&#1072; &#1085;&#1077;&#1075;&#1086; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;&#1072; &#1080; &#1085;&#1072;&#1078;&#1072;&#1090;&#1080;&#1103; &#1085;&#1072; &#1075;&#1072;&#1096;&#1077;&#1090;&#1082;&#1091; (&#1082;&#1085;&#1086;&#1087;&#1082;&#1072; &#171;&#1054;&#1075;&#1086;&#1085;&#1100;&#187;). &#1053;&#1077;&#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1080; &#1090;&#1072;&#1082; &#1078;&#1077; &#1084;&#1086;&#1075;&#1091;&#1090; &#1074;&#1077;&#1089;&#1090;&#1080; &#1086;&#1075;&#1086;&#1085;&#1100; &#1087;&#1086; &#1080;&#1075;&#1088;&#1086;&#1082;&#1091;, &#1074;&#1077;&#1088;&#1090;&#1086;&#1083;&#1077;&#1090; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1072;&#1077;&#1090;&#1089;&#1103;, &#1077;&#1089;&#1083;&#1080; &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1102;&#1097;&#1080;&#1081; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082; &#1085;&#1077; &#1073;&#1091;&#1076;&#1077;&#1090; &#1089;&#1074;&#1086;&#1077;&#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1085;&#1086; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;. &#1047;&#1072; &#1082;&#1072;&#1078;&#1076;&#1086;&#1075;&#1086; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1077;&#1085;&#1085;&#1086;&#1075;&#1086; &#1087;&#1088;&#1086;&#1090;&#1080;&#1074;&#1085;&#1080;&#1082;&#1072; &#1085;&#1072;&#1095;&#1080;&#1089;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; 10 &#1080;&#1075;&#1088;&#1086;&#1074;&#1099;&#1093; &#1086;&#1095;&#1082;&#1086;&#1074;.</rus>\n           <eng>You are a pilot of a military copter and your task is to kill as many as possible enemy copters.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"oysterbank\"  title=\"OYSTER BANK\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1085;&#1099;&#1088;&#1103;&#1083;&#1100;&#1097;&#1080;&#1082;&#1086;&#1084;, &#1086;&#1093;&#1086;&#1090;&#1103;&#1097;&#1080;&#1084;&#1089;&#1103; &#1079;&#1072; &#1078;&#1077;&#1084;&#1095;&#1091;&#1078;&#1080;&#1085;&#1072;&#1084;&#1080; &#1085;&#1072; &#1084;&#1086;&#1088;&#1089;&#1082;&#1086;&#1084; &#1076;&#1085;&#1077;.</rus>\n           <eng>You are a diver gathering pearls.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1085;&#1099;&#1088;&#1103;&#1083;&#1100;&#1097;&#1080;&#1082;&#1086;&#1084;, &#1086;&#1093;&#1086;&#1090;&#1103;&#1097;&#1080;&#1084;&#1089;&#1103; &#1079;&#1072; &#1078;&#1077;&#1084;&#1095;&#1091;&#1078;&#1080;&#1085;&#1072;&#1084;&#1080; &#1085;&#1072; &#1084;&#1086;&#1088;&#1089;&#1082;&#1086;&#1084; &#1076;&#1085;&#1077;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1072;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1090;&#1100; &#1083;&#1086;&#1074;&#1094;&#1072; &#1082; &#1090;&#1077;&#1084; &#1088;&#1072;&#1082;&#1086;&#1074;&#1080;&#1085;&#1072;&#1084;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1099;, &#1089;&#1083;&#1077;&#1076;&#1080;&#1090;&#1100; &#1079;&#1072; &#1077;&#1075;&#1086; &#1079;&#1072;&#1087;&#1072;&#1089;&#1086;&#1084; &#1082;&#1080;&#1089;&#1083;&#1086;&#1088;&#1086;&#1076;&#1072; &#1080; &#1073;&#1077;&#1088;&#1077;&#1095;&#1100; &#1086;&#1090; &#1072;&#1082;&#1091;&#1083;</rus>\n           <eng>You are a diver gathering pearls. You should collect as many pearls as possible. You have to avoid collisions with a shark. The oxygen cylinder is limited so you have to look after its level.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"ravenscheese\"  title=\"RAVEN'S CHEESE\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1042;&#1086;&#1088;&#1086;&#1085;&#1077; &#1041;&#1086;&#1075; &#1087;&#1086;&#1089;&#1083;&#1072;&#1083; &#1082;&#1091;&#1089;&#1086;&#1095;&#1077;&#1082; &#1089;&#1099;&#1088;&#1072;, &#1085;&#1086; &#1090;&#1088;&#1091;&#1076;&#1085;&#1086; &#1073;&#1091;&#1076;&#1077;&#1090; &#1083;&#1080;&#1089;&#1077; &#1077;&#1089;&#1083;&#1080; &#1094;&#1077;&#1083;&#1072;&#1103; &#1089;&#1090;&#1072;&#1103; &#1074;&#1086;&#1088;&#1086;&#1085; &#1073;&#1086;&#1084;&#1073;&#1080;&#1090; &#1077;&#1105; &#1089;&#1099;&#1088;&#1086;&#1084;...</rus>\n           <eng>You drive a fox and your task to catch cheeses that throwed by ravens.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1074;&#1099;&#1089;&#1090;&#1091;&#1087;&#1072;&#1077;&#1090; &#1074; &#1088;&#1086;&#1083;&#1080; &#1083;&#1080;&#1089;&#1099;, &#1083;&#1086;&#1074;&#1103;&#1097;&#1077;&#1081; &#1082;&#1091;&#1089;&#1082;&#1080; &#1089;&#1099;&#1088;&#1072;, &#1073;&#1088;&#1086;&#1089;&#1072;&#1077;&#1084;&#1086;&#1075;&#1086; &#1074;&#1086;&#1088;&#1086;&#1085;&#1072;&#1084;&#1080;. &#1047;&#1072;&#1076;&#1072;&#1095;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1085;&#1072;&#1083;&#1086;&#1074;&#1080;&#1090;&#1100; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1091;&#1089;&#1082;&#1086;&#1074; &#1089;&#1099;&#1088;&#1072;. &#1048;&#1075;&#1088;&#1072; &#1085;&#1077; &#1080;&#1084;&#1077;&#1077;&#1090; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1080;&#1103; &#1087;&#1086; &#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1080;, &#1085;&#1086; &#1080;&#1084;&#1077;&#1077;&#1090; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1080;&#1077; &#1087;&#1086; &#1084;&#1072;&#1082;&#1089;&#1080;&#1084;&#1072;&#1083;&#1100;&#1085;&#1086;&#1084;&#1091; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1091; &#1087;&#1088;&#1086;&#1087;&#1091;&#1097;&#1077;&#1085;&#1085;&#1099;&#1093; &#1089;&#1099;&#1088;&#1086;&#1074;. &#1053;&#1072; &#1074;&#1077;&#1090;&#1074;&#1103;&#1093; &#1076;&#1077;&#1088;&#1077;&#1074;&#1100;&#1077;&#1074; &#1087;&#1086;&#1103;&#1074;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1074;&#1086;&#1088;&#1086;&#1085;&#1099; &#1089; &#1089;&#1099;&#1088;&#1086;&#1084; &#1074; &#1082;&#1083;&#1102;&#1074;&#1077;, &#1080;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1091;&#1075;&#1072;&#1076;&#1072;&#1090;&#1100; &#1084;&#1086;&#1084;&#1077;&#1085;&#1090; &#1073;&#1088;&#1086;&#1089;&#1082;&#1072; &#1089;&#1099;&#1088;&#1072; &#1080; &#1087;&#1086;&#1089;&#1090;&#1072;&#1074;&#1080;&#1090;&#1100; &#1083;&#1080;&#1089;&#1091; &#1074; &#1087;&#1086;&#1079;&#1080;&#1094;&#1080;&#1102;, &#1087;&#1088;&#1080; &#1082;&#1086;&#1090;&#1086;&#1088;&#1086;&#1081; &#1089;&#1099;&#1088; &#1073;&#1091;&#1076;&#1077;&#1090; &#1073;&#1088;&#1086;&#1096;&#1077;&#1085; &#1077;&#1081; &#1074; &#1087;&#1072;&#1089;&#1090;&#1100;. &#1042;&#1089;&#1077;&#1075;&#1086; &#1080;&#1084;&#1077;&#1077;&#1090;&#1089;&#1103; &#1095;&#1077;&#1090;&#1099;&#1088;&#1077; &#1087;&#1086;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1103; &#1083;&#1080;&#1089;&#1099;. &#1048;&#1075;&#1088;&#1086;&#1082;&#1091; &#1089;&#1083;&#1077;&#1076;&#1091;&#1077;&#1090; &#1091;&#1095;&#1080;&#1090;&#1099;&#1074;&#1072;&#1090;&#1100;, &#1095;&#1090;&#1086; &#1083;&#1080;&#1089;&#1072; &#1085;&#1077; &#1084;&#1086;&#1078;&#1077;&#1090; &#1087;&#1086;&#1089;&#1090;&#1086;&#1103;&#1085;&#1085;&#1086; &#1089;&#1090;&#1086;&#1103;&#1090;&#1100; &#1085;&#1072; &#1079;&#1072;&#1076;&#1085;&#1080;&#1093; &#1083;&#1072;&#1087;&#1072;&#1093; &#1080; &#1095;&#1077;&#1088;&#1077;&#1079; &#1082;&#1072;&#1082;&#1086;&#1077; &#1090;&#1086; &#1074;&#1088;&#1077;&#1084;&#1103; &#1086;&#1087;&#1091;&#1089;&#1082;&#1072;&#1077;&#1090;&#1089;&#1103;.  &#1045;&#1089;&#1083;&#1080; &#1074;&#1086;&#1088;&#1086;&#1085;&#1072; &#1076;&#1086;&#1093;&#1086;&#1076;&#1080;&#1090; &#1076;&#1086; &#1082;&#1088;&#1072;&#1103; &#1074;&#1077;&#1090;&#1082;&#1080;, &#1072; &#1083;&#1080;&#1089;&#1072; &#1085;&#1077; &#1075;&#1086;&#1090;&#1086;&#1074;&#1072; &#1087;&#1086;&#1081;&#1084;&#1072;&#1090;&#1100; &#1089;&#1099;&#1088;, &#1090;&#1086; &#1088;&#1072;&#1079;&#1076;&#1072;&#1077;&#1090;&#1089;&#1103; &#1082;&#1072;&#1088;&#1082;&#1072;&#1085;&#1100;&#1077; &#1080; &#1089;&#1099;&#1088; &#1087;&#1072;&#1076;&#1072;&#1077;&#1090; &#1085;&#1072; &#1079;&#1077;&#1084;&#1083;&#1102;. &#1057; &#1082;&#1088;&#1072;&#1103; &#1101;&#1082;&#1088;&#1072;&#1085;&#1072; &#1074;&#1099;&#1073;&#1077;&#1075;&#1072;&#1077;&#1090; &#1084;&#1099;&#1096;&#1100; &#1080; &#1091;&#1085;&#1086;&#1089;&#1080;&#1090; &#1082;&#1091;&#1089;&#1086;&#1082; &#1089;&#1099;&#1088;&#1072;, &#1087;&#1088;&#1080; &#1101;&#1090;&#1086;&#1084; &#1091; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1079;&#1072;&#1073;&#1080;&#1088;&#1072;&#1077;&#1090;&#1089;&#1103; &#1086;&#1076;&#1085;&#1072; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072;. &#1057;&#1082;&#1086;&#1088;&#1086;&#1089;&#1090;&#1100; &#1087;&#1086;&#1103;&#1074;&#1083;&#1077;&#1085;&#1080;&#1103; &#1074;&#1086;&#1088;&#1086;&#1085; &#1089;&#1086; &#1074;&#1088;&#1077;&#1084;&#1077;&#1085;&#1077;&#1084; &#1091;&#1074;&#1077;&#1083;&#1080;&#1095;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103;, &#1085;&#1086; &#1087;&#1088;&#1080; &#1076;&#1086;&#1089;&#1090;&#1080;&#1078;&#1077;&#1085;&#1080;&#1080; &#1080;&#1075;&#1088;&#1086;&#1082;&#1086;&#1084; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1072; &#1086;&#1095;&#1082;&#1086;&#1074; &#1082;&#1088;&#1072;&#1090;&#1085;&#1086;&#1075;&#1086; 50, &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1086;  &#1087;&#1086;&#1087;&#1099;&#1090;&#1086;&#1082; &#1080;&#1075;&#1088;&#1086;&#1082;&#1072; &#1074;&#1086;&#1089;&#1089;&#1090;&#1072;&#1085;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103;.  &#1042;&#1099;&#1080;&#1075;&#1088;&#1099;&#1096;&#1085;&#1072;&#1103; &#1082;&#1072;&#1088;&#1090;&#1080;&#1085;&#1082;&#1072; &#1073;&#1091;&#1076;&#1077;&#1090; &#1087;&#1086;&#1082;&#1072;&#1079;&#1072;&#1085;&#1072; &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1087;&#1088;&#1080; &#1085;&#1072;&#1073;&#1088;&#1072;&#1085;&#1085;&#1086;&#1084; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1077; &#1089;&#1099;&#1088;&#1086;&#1074; &#1085;&#1077; &#1084;&#1077;&#1085;&#1100;&#1096;&#1077; 100. &#1055;&#1088;&#1080; &#1076;&#1086;&#1089;&#1090;&#1080;&#1078;&#1077;&#1085;&#1080;&#1080; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1072; &#1086;&#1095;&#1082;&#1086;&#1074; &#1082;&#1088;&#1072;&#1090;&#1085;&#1086;&#1075;&#1086; 50, &#1089;&#1082;&#1086;&#1088;&#1086;&#1089;&#1090;&#1100; &#1087;&#1086;&#1103;&#1074;&#1083;&#1077;&#1085;&#1080;&#1103; &#1074;&#1086;&#1088;&#1086;&#1085; &#1091;&#1084;&#1077;&#1085;&#1100;&#1096;&#1072;&#1077;&#1090;&#1089;&#1103;.</rus>\n           <eng>You drive a fox and your task to catch cheeses that throwed by ravens.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"searovers\"  title=\"SEA ROVERS\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1040; &#1085;&#1077; &#1087;&#1086;&#1086;&#1093;&#1086;&#1090;&#1080;&#1090;&#1100;&#1089;&#1103; &#1083;&#1080; &#1089;&#1086; &#1089;&#1082;&#1091;&#1082;&#1080; &#1085;&#1072; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080; &#1074; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1086;&#1084; &#1084;&#1086;&#1088;&#1077;? &#1040; &#1087;&#1086;&#1095;&#1077;&#1084;&#1091; &#1073;&#1099; &#1080; &#1085;&#1077;&#1090;?</rus>\n           <eng>You are a pirate hunting for cargo ships.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1087;&#1080;&#1088;&#1072;&#1090;&#1089;&#1082;&#1080;&#1084; &#1087;&#1072;&#1088;&#1091;&#1089;&#1085;&#1099;&#1084; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1077;&#1084; &#1080;  &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1079;&#1072;&#1093;&#1074;&#1072;&#1090;&#1099;&#1074;&#1072;&#1090;&#1100; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080;, &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1103; &#1074;&#1089;&#1090;&#1088;&#1077;&#1095;&#1080; &#1089; &#1074;&#1086;&#1077;&#1085;&#1085;&#1099;&#1084;&#1080; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1103;&#1084;&#1080;. &#1042;&#1089;&#1077; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080; &#1074;&#1086;&#1086;&#1088;&#1091;&#1078;&#1077;&#1085;&#1099; &#1080; &#1076;&#1077;&#1083;&#1103;&#1090;&#1089;&#1103; &#1085;&#1072; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077;, &#1074;&#1086;&#1077;&#1085;&#1085;&#1099;&#1077; &#1080; &#1087;&#1088;&#1086;&#1095;&#1080;&#1077; (&#1073;&#1086;&#1090;&#1099;). &#1050;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080; &#1086;&#1090;&#1083;&#1080;&#1095;&#1072;&#1102;&#1090;&#1089;&#1103; &#1090;&#1072;&#1082;&#1078;&#1077; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1086;&#1084; &#1101;&#1085;&#1077;&#1088;&#1075;&#1080;&#1080; &#1080;, &#1089;&#1086;&#1086;&#1090;&#1074;&#1077;&#1090;&#1089;&#1090;&#1074;&#1077;&#1085;&#1085;&#1086;, &#1095;&#1080;&#1089;&#1083;&#1086;&#1084; &#1073;&#1086;&#1088;&#1090;&#1086;&#1074;&#1099;&#1093; &#1079;&#1072;&#1083;&#1087;&#1086;&#1074;, &#1085;&#1077;&#1086;&#1073;&#1093;&#1086;&#1076;&#1080;&#1084;&#1099;&#1093; &#1076;&#1083;&#1103; &#1080;&#1093; &#1087;&#1086;&#1090;&#1086;&#1087;&#1083;&#1077;&#1085;&#1080;&#1103;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1072;&#1087;&#1072;&#1076;&#1072;&#1090;&#1100; &#1085;&#1072; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080; &#1080; &#1086;&#1087;&#1072;&#1089;&#1072;&#1090;&#1100;&#1089;&#1103; &#1074;&#1086;&#1077;&#1085;&#1085;&#1099;&#1093;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1084;&#1086;&#1075;&#1091;&#1090; &#1076;&#1072;&#1090;&#1100; &#1086;&#1090;&#1087;&#1086;&#1088;. &#1055;&#1088;&#1086;&#1095;&#1080;&#1077; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1080;  &#1090;&#1072;&#1082;&#1078;&#1077; &#1084;&#1086;&#1075;&#1091;&#1090; &#1073;&#1099;&#1090;&#1100; &#1084;&#1080;&#1096;&#1077;&#1085;&#1100;&#1102; &#1076;&#1083;&#1103; &#1087;&#1091;&#1096;&#1077;&#1082; &#1087;&#1080;&#1088;&#1072;&#1090;&#1089;&#1082;&#1086;&#1075;&#1086; &#1082;&#1086;&#1088;&#1072;&#1073;&#1083;&#1103;, &#1085;&#1086; &#1101;&#1090;&#1086; &#1085;&#1077; &#1087;&#1088;&#1080;&#1085;&#1077;&#1089;&#1077;&#1090; &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1084;&#1085;&#1086;&#1075;&#1086; &#1086;&#1095;&#1082;&#1086;&#1074;.</rus>\n           <eng>You are a pirate hunting for cargo ships. When you have damaged a cargo ship (it has three-cornered sail), you should stop own ship near it to enable your crew to rob the ship. You have to avoid collisions with battleships. Good luck, captain!</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"searoad\"  title=\"SEA ROAD\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n        <racing/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1089;&#1087;&#1086;&#1088;&#1090;&#1080;&#1074;&#1085;&#1099;&#1084; &#1082;&#1072;&#1090;&#1077;&#1088;&#1086;&#1084;, &#1087;&#1088;&#1080;&#1085;&#1080;&#1084;&#1072;&#1102;&#1097;&#1080;&#1084; &#1091;&#1095;&#1072;&#1089;&#1090;&#1080;&#1077; &#1074; &#1089;&#1083;&#1072;&#1083;&#1086;&#1084;&#1077; &#1085;&#1072; &#1086;&#1078;&#1080;&#1074;&#1083;&#1077;&#1085;&#1085;&#1086;&#1084; &#1084;&#1086;&#1088;&#1089;&#1082;&#1086;&#1084; &#1087;&#1091;&#1090;&#1080;.</rus>\n           <eng>You are a driver of a speedboat.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1089;&#1087;&#1086;&#1088;&#1090;&#1080;&#1074;&#1085;&#1099;&#1084; &#1082;&#1072;&#1090;&#1077;&#1088;&#1086;&#1084;, &#1087;&#1088;&#1080;&#1085;&#1080;&#1084;&#1072;&#1102;&#1097;&#1080;&#1084; &#1091;&#1095;&#1072;&#1089;&#1090;&#1080;&#1077; &#1074; &#1089;&#1083;&#1072;&#1083;&#1086;&#1084;&#1077; &#1085;&#1072; &#1086;&#1078;&#1080;&#1074;&#1083;&#1077;&#1085;&#1085;&#1086;&#1084; &#1084;&#1086;&#1088;&#1089;&#1082;&#1086;&#1084; &#1087;&#1091;&#1090;&#1080;. &#1044;&#1074;&#1080;&#1075;&#1072;&#1103;&#1089;&#1100; &#1087;&#1086; &#1076;&#1080;&#1089;&#1090;&#1072;&#1085;&#1094;&#1080;&#1080;, &#1080;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1087;&#1088;&#1086;&#1093;&#1086;&#1076;&#1080;&#1090;&#1100; &#1095;&#1077;&#1088;&#1077;&#1079; &#1074;&#1089;&#1090;&#1088;&#1077;&#1095;&#1085;&#1099;&#1077; &#1074;&#1086;&#1088;&#1086;&#1090;&#1072;, &#1074;&#1088;&#1077;&#1084;&#1103; &#1087;&#1088;&#1086;&#1093;&#1086;&#1078;&#1076;&#1077;&#1085;&#1080;&#1103; &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1093; &#1074;&#1083;&#1080;&#1103;&#1077;&#1090; &#1085;&#1072; &#1079;&#1072;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1084;&#1099;&#1077; &#1086;&#1095;&#1082;&#1080;.</rus>\n           <eng>You are a driver of a speedboat and your task is to pass as many gates as possible during limited time. You should avoid collisions with other ships.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"mobilesheriff\"  title=\"MOBILE SHERIFF\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1096;&#1077;&#1088;&#1080;&#1092;&#1086;&#1084;, &#1086;&#1089;&#1074;&#1086;&#1073;&#1086;&#1078;&#1076;&#1072;&#1102;&#1097;&#1080;&#1084; &#1084;&#1072;&#1083;&#1077;&#1085;&#1100;&#1082;&#1080;&#1081; &#1090;&#1077;&#1093;&#1072;&#1089;&#1089;&#1082;&#1080;&#1081; &#1075;&#1086;&#1088;&#1086;&#1076; &#1086;&#1090; &#1073;&#1072;&#1085;&#1076;&#1099;.</rus>\n           <eng>You are a brave sheriff of Wild West who is releasing a small town from a band.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1096;&#1077;&#1088;&#1080;&#1092;&#1086;&#1084;, &#1086;&#1089;&#1074;&#1086;&#1073;&#1086;&#1078;&#1076;&#1072;&#1102;&#1097;&#1080;&#1084; &#1084;&#1072;&#1083;&#1077;&#1085;&#1100;&#1082;&#1080;&#1081; &#1090;&#1077;&#1093;&#1072;&#1089;&#1089;&#1082;&#1080;&#1081; &#1075;&#1086;&#1088;&#1086;&#1076; &#1086;&#1090; &#1073;&#1072;&#1085;&#1076;&#1099;. &#1063;&#1080;&#1089;&#1083;&#1086; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1086;&#1074; &#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1086;, &#1085;&#1086; &#1074; &#1083;&#1080;&#1094;&#1086; &#1080;&#1093; &#1085;&#1080;&#1082;&#1090;&#1086; &#1085;&#1077; &#1079;&#1085;&#1072;&#1077;&#1090;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1086;&#1090;&#1083;&#1080;&#1095;&#1080;&#1090;&#1100; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1086;&#1074; &#1086;&#1090; &#1084;&#1080;&#1088;&#1085;&#1099;&#1093; &#1075;&#1086;&#1088;&#1086;&#1078;&#1072;&#1085; &#1080; &#1091;&#1085;&#1080;&#1095;&#1090;&#1086;&#1078;&#1080;&#1090;&#1100; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1086;&#1074;. &#1042; &#1087;&#1088;&#1086;&#1077;&#1084;&#1072;&#1093; &#1086;&#1082;&#1086;&#1085; &#1080; &#1076;&#1074;&#1077;&#1088;&#1077;&#1081; &#1087;&#1077;&#1088;&#1080;&#1086;&#1076;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1087;&#1086;&#1103;&#1074;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1080; &#1087;&#1088;&#1103;&#1095;&#1091;&#1090;&#1089;&#1103; &#1095;&#1077;&#1083;&#1086;&#1074;&#1077;&#1095;&#1082;&#1080;. &#1063;&#1077;&#1083;&#1086;&#1074;&#1077;&#1095;&#1082;&#1080; &#1084;&#1086;&#1075;&#1091;&#1090; &#1073;&#1099;&#1090;&#1100; &#1084;&#1080;&#1088;&#1085;&#1099;&#1084;&#1080; &#1075;&#1086;&#1088;&#1086;&#1078;&#1072;&#1085;&#1072;&#1084;&#1080; &#1080;&#1083;&#1080; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1072;&#1084;&#1080;. &#1041;&#1072;&#1085;&#1076;&#1080;&#1090; &#1074;&#1085;&#1077;&#1096;&#1085;&#1077; &#1086;&#1090;&#1083;&#1080;&#1095;&#1072;&#1077;&#1090;&#1089;&#1103; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1090;&#1077;&#1084;, &#1095;&#1090;&#1086; &#1085;&#1072;&#1095;&#1080;&#1085;&#1072;&#1077;&#1090; &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1090;&#1100; &#1074; &#1096;&#1077;&#1088;&#1080;&#1092;&#1072;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1090;&#1100; &#1087;&#1077;&#1088;&#1074;&#1099;&#1084;, &#1088;&#1080;&#1089;&#1082;&#1091;&#1103; &#1091;&#1073;&#1080;&#1090;&#1100; &#1075;&#1086;&#1088;&#1086;&#1078;&#1072;&#1085;&#1080;&#1085;&#1072; &#1080;&#1083;&#1080; &#1078;&#1076;&#1072;&#1090;&#1100; &#1087;&#1086;&#1082;&#1072; &#1087;&#1086; &#1085;&#1077;&#1084;&#1091; &#1085;&#1077; &#1085;&#1072;&#1095;&#1085;&#1091;&#1090; &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1090;&#1100; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1099;. &#1041;&#1072;&#1085;&#1076;&#1080;&#1090; &#1076;&#1077;&#1083;&#1072;&#1077;&#1090; &#1088;&#1072;&#1079;&#1085;&#1086;&#1077; &#1095;&#1080;&#1089;&#1083;&#1086; &#1074;&#1099;&#1089;&#1090;&#1088;&#1077;&#1083;&#1086;&#1074;, &#1085;&#1086; &#1091;&#1073;&#1080;&#1090;&#1100; &#1096;&#1077;&#1088;&#1080;&#1092;&#1072; &#1084;&#1086;&#1078;&#1077;&#1090; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1090;&#1088;&#1077;&#1090;&#1100;&#1080;&#1084; &#1074;&#1099;&#1089;&#1090;&#1088;&#1077;&#1083;&#1086;&#1084; &#1087;&#1086;&#1076;&#1088;&#1103;&#1076;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1091;&#1089;&#1087;&#1077;&#1090;&#1100; &#1079;&#1072; &#1101;&#1090;&#1086; &#1074;&#1088;&#1077;&#1084;&#1103; &#1087;&#1088;&#1080;&#1094;&#1077;&#1083;&#1080;&#1090;&#1100;&#1089;&#1103; &#1080; &#1074;&#1099;&#1089;&#1090;&#1088;&#1077;&#1083;&#1080;&#1090;&#1100;. &#1059;&#1073;&#1080;&#1074; &#1084;&#1080;&#1088;&#1085;&#1086;&#1075;&#1086; &#1075;&#1086;&#1088;&#1086;&#1078;&#1072;&#1085;&#1080;&#1085;&#1072;, &#1080;&#1075;&#1088;&#1086;&#1082; &#1090;&#1077;&#1088;&#1103;&#1077;&#1090; &#1086;&#1076;&#1085;&#1091; &#1080;&#1075;&#1088;&#1086;&#1074;&#1091;&#1102; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1091;. &#1059;&#1073;&#1080;&#1074; &#1073;&#1072;&#1085;&#1076;&#1080;&#1090;&#1072;, &#1080;&#1075;&#1088;&#1086;&#1082; &#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1077;&#1090; &#1086;&#1095;&#1082;&#1080;.</rus>\n           <eng>You are a brave sheriff of Wild West who is releasing a small town from a band. The number of the bandits is known but you don&#8217;t know their faces so you must be careful because there are a lot of   inhabitants in the town and you must not kill them (we recommend you to wait an unkind action and don&#8217;t shoot before).</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"smashingkick\"  title=\"SMASHING KICK\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n        <sport/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082;  &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1090;&#1088;&#1077;&#1085;&#1080;&#1088;&#1091;&#1102;&#1097;&#1080;&#1084;&#1089;&#1103; &#1092;&#1091;&#1090;&#1073;&#1086;&#1083;&#1080;&#1089;&#1090;&#1086;&#1084; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1076;&#1086;&#1074;&#1077;&#1089;&#1090;&#1080; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1084;&#1103;&#1095;&#1077;&#1081; &#1076;&#1086; &#1074;&#1086;&#1088;&#1086;&#1090;, &#1085;&#1077; &#1088;&#1086;&#1085;&#1103;&#1103; &#1080;&#1093; &#1085;&#1072; &#1079;&#1077;&#1084;&#1083;&#1102;.</rus>\n           <eng>You are a training footballer and your task is to kick as many as possible balls into the goal.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082;  &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1090;&#1088;&#1077;&#1085;&#1080;&#1088;&#1091;&#1102;&#1097;&#1080;&#1084;&#1089;&#1103; &#1092;&#1091;&#1090;&#1073;&#1086;&#1083;&#1080;&#1089;&#1090;&#1086;&#1084; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1076;&#1086;&#1074;&#1077;&#1089;&#1090;&#1080; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1084;&#1103;&#1095;&#1077;&#1081; &#1076;&#1086; &#1074;&#1086;&#1088;&#1086;&#1090;, &#1085;&#1077; &#1088;&#1086;&#1085;&#1103;&#1103; &#1080;&#1093; &#1085;&#1072; &#1079;&#1077;&#1084;&#1083;&#1102;. &#1058;&#1088;&#1077;&#1085;&#1077;&#1088; &#1089; &#1091;&#1084;&#1077;&#1085;&#1100;&#1096;&#1072;&#1102;&#1097;&#1080;&#1084;&#1089;&#1103; &#1080;&#1085;&#1090;&#1077;&#1088;&#1074;&#1072;&#1083;&#1086;&#1084; &#1087;&#1086;&#1076;&#1072;&#1077;&#1090; &#1084;&#1103;&#1095;&#1080; &#1080; &#1080;&#1075;&#1088;&#1086;&#1082;, &#1091;&#1076;&#1077;&#1088;&#1078;&#1080;&#1074;&#1072;&#1103; &#1084;&#1103;&#1095; &#1074; &#1074;&#1086;&#1079;&#1076;&#1091;&#1093;&#1077; &#1087;&#1088;&#1080; &#1087;&#1086;&#1084;&#1086;&#1097;&#1080; &#1085;&#1086;&#1075; &#1080; &#1075;&#1086;&#1083;&#1086;&#1074;&#1099;, &#1076;&#1086;&#1074;&#1086;&#1076;&#1080;&#1090; &#1077;&#1075;&#1086; &#1076;&#1086; &#1074;&#1086;&#1088;&#1086;&#1090; &#1080; &#1079;&#1072;&#1073;&#1080;&#1074;&#1072;&#1077;&#1090;, &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072; &#1089;&#1085;&#1080;&#1084;&#1072;&#1077;&#1090;&#1089;&#1103; &#1077;&#1089;&#1083;&#1080; &#1084;&#1103;&#1095; &#1082;&#1072;&#1089;&#1072;&#1077;&#1090;&#1089;&#1103; &#1079;&#1077;&#1084;&#1083;&#1080;.  &#1055;&#1086;&#1089;&#1083;&#1077; 10 &#1079;&#1072;&#1073;&#1080;&#1090;&#1099;&#1093; &#1084;&#1103;&#1095;&#1077;&#1081; &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1074;&#1086;&#1089;&#1089;&#1090;&#1072;&#1085;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; 1 &#1080;&#1075;&#1088;&#1086;&#1074;&#1072;&#1103; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072;.</rus>\n           <eng>You are a training footballer and your task is to kick as many as possible balls into the goal. You have to keep the ball in the air with your foots and head.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"spiders\"  title=\"SPIDERS\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1077;&#1084;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1086;&#1089;&#1080;&#1090;&#1100; &#1074; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082; &#1074;&#1077;&#1090;&#1086;&#1095;&#1082;&#1080; &#1080;&#1079; &#1083;&#1077;&#1078;&#1072;&#1097;&#1077;&#1081; &#1085;&#1077;&#1074;&#1076;&#1072;&#1083;&#1077;&#1082;&#1077; &#1082;&#1091;&#1095;&#1080; &#1080; &#1085;&#1077; &#1089;&#1090;&#1072;&#1090;&#1100; &#1076;&#1086;&#1073;&#1099;&#1095;&#1077;&#1081; &#1087;&#1072;&#1091;&#1082;&#1086;&#1074;, &#1089;&#1087;&#1091;&#1089;&#1082;&#1072;&#1102;&#1097;&#1080;&#1093;&#1089;&#1103; &#1089;&#1074;&#1077;&#1088;&#1093;&#1091; &#1085;&#1072; &#1087;&#1072;&#1091;&#1090;&#1080;&#1085;&#1077;.</rus>\n           <eng>You are an ant bringing twigs into own anthill.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1077;&#1084;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1086;&#1089;&#1080;&#1090;&#1100; &#1074; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082; &#1074;&#1077;&#1090;&#1086;&#1095;&#1082;&#1080; &#1080;&#1079; &#1083;&#1077;&#1078;&#1072;&#1097;&#1077;&#1081; &#1085;&#1077;&#1074;&#1076;&#1072;&#1083;&#1077;&#1082;&#1077; &#1082;&#1091;&#1095;&#1080; &#1080; &#1085;&#1077; &#1089;&#1090;&#1072;&#1090;&#1100; &#1076;&#1086;&#1073;&#1099;&#1095;&#1077;&#1081; &#1087;&#1072;&#1091;&#1082;&#1086;&#1074;, &#1089;&#1087;&#1091;&#1089;&#1082;&#1072;&#1102;&#1097;&#1080;&#1093;&#1089;&#1103; &#1089;&#1074;&#1077;&#1088;&#1093;&#1091; &#1085;&#1072; &#1087;&#1072;&#1091;&#1090;&#1080;&#1085;&#1077;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1087;&#1077;&#1088;&#1077;&#1084;&#1077;&#1097;&#1072;&#1090;&#1100; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1103; &#1074;&#1083;&#1077;&#1074;&#1086;/&#1074;&#1087;&#1088;&#1072;&#1074;&#1086;. &#1055;&#1086;&#1076;&#1073;&#1077;&#1078;&#1072;&#1074; &#1082; &#1082;&#1091;&#1095;&#1077; &#1074;&#1077;&#1090;&#1086;&#1095;&#1077;&#1082;, &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081; &#1074;&#1079;&#1074;&#1072;&#1083;&#1080;&#1074;&#1072;&#1077;&#1090; &#1086;&#1076;&#1085;&#1091; &#1089;&#1077;&#1073;&#1077; &#1085;&#1072; &#1089;&#1087;&#1080;&#1085;&#1091;. &#1042;&#1077;&#1088;&#1085;&#1091;&#1074;&#1096;&#1080;&#1089;&#1100; &#1082; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082;&#1091;, &#1086;&#1085; &#1073;&#1088;&#1086;&#1089;&#1072;&#1077;&#1090; &#1089;&#1074;&#1086;&#1081; &#1075;&#1088;&#1091;&#1079; &#1074; &#1087;&#1088;&#1086;&#1077;&#1084; &#1080; &#1073;&#1077;&#1078;&#1080;&#1090; &#1079;&#1072; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1084;. &#1047;&#1072; &#1082;&#1072;&#1078;&#1076;&#1091;&#1102; &#1076;&#1086;&#1089;&#1090;&#1072;&#1074;&#1083;&#1077;&#1085;&#1085;&#1091;&#1102; &#1074;&#1077;&#1090;&#1086;&#1095;&#1082;&#1091; &#1080;&#1075;&#1088;&#1086;&#1082;&#1091; &#1085;&#1072;&#1095;&#1080;&#1089;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1086;&#1095;&#1082;&#1080;. &#1052;&#1077;&#1078;&#1076;&#1091; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082;&#1086;&#1084; &#1080; &#1082;&#1091;&#1095;&#1077;&#1081; &#1074;&#1077;&#1090;&#1086;&#1082; &#1074;&#1080;&#1089;&#1103;&#1090; &#1085;&#1072; &#1089;&#1074;&#1086;&#1080;&#1093; &#1087;&#1072;&#1091;&#1090;&#1080;&#1085;&#1072;&#1093; &#1087;&#1072;&#1091;&#1082;&#1080;, &#1087;&#1086;&#1076;&#1078;&#1080;&#1076;&#1072;&#1102;&#1097;&#1080;&#1077; &#1076;&#1086;&#1073;&#1099;&#1095;&#1091;. &#1055;&#1072;&#1091;&#1082;&#1080; &#1073;&#1099;&#1089;&#1090;&#1088;&#1086; &#1086;&#1087;&#1091;&#1089;&#1082;&#1072;&#1102;&#1090;&#1089;&#1103; &#1080; &#1084;&#1077;&#1076;&#1083;&#1077;&#1085;&#1085;&#1086; &#1087;&#1086;&#1076;&#1085;&#1080;&#1084;&#1072;&#1102;&#1090;&#1089;&#1103; &#1087;&#1086; &#1087;&#1072;&#1091;&#1090;&#1080;&#1085;&#1077;. &#1050;&#1088;&#1086;&#1084;&#1077; &#1090;&#1086;&#1075;&#1086;, &#1086;&#1085;&#1080; &#1087;&#1077;&#1088;&#1077;&#1076;&#1074;&#1080;&#1075;&#1072;&#1102;&#1090;&#1089;&#1103; &#1089; &#1086;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1082;&#1072;&#1084;&#1080;, &#1080;&#1085;&#1086;&#1075;&#1076;&#1072; &#1084;&#1077;&#1085;&#1103;&#1103; &#1087;&#1086;&#1089;&#1083;&#1077; &#1090;&#1072;&#1082;&#1086;&#1081; &#1087;&#1072;&#1091;&#1079;&#1099; &#1085;&#1072;&#1087;&#1088;&#1072;&#1074;&#1083;&#1077;&#1085;&#1080;&#1077; &#1076;&#1074;&#1080;&#1078;&#1077;&#1085;&#1080;&#1103;. &#1045;&#1089;&#1083;&#1080; &#1087;&#1072;&#1091;&#1082; &#1089;&#1093;&#1074;&#1072;&#1090;&#1080;&#1090; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1103;, &#1090;&#1086; &#1080;&#1075;&#1088;&#1086;&#1082; &#1090;&#1077;&#1088;&#1103;&#1077;&#1090; &#1086;&#1076;&#1085;&#1091; &#1080;&#1075;&#1088;&#1086;&#1074;&#1091;&#1102; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1091;.</rus>\n           <eng>You are an ant bringing twigs into own anthill. You should bring as many twigs as possible and to avoid clutches of spiders.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"tastydish\"  title=\"TASTY DISH\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083;&#1086;&#1084;, &#1086;&#1093;&#1086;&#1090;&#1103;&#1097;&#1080;&#1084;&#1089;&#1103; &#1074; &#1088;&#1077;&#1082;&#1077; &#1091; &#1073;&#1077;&#1088;&#1077;&#1075;&#1072;.</rus>\n           <eng>You are a crocodile living in a river.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083;&#1086;&#1084;, &#1086;&#1093;&#1086;&#1090;&#1103;&#1097;&#1080;&#1084;&#1089;&#1103; &#1074; &#1088;&#1077;&#1082;&#1077; &#1091; &#1073;&#1077;&#1088;&#1077;&#1075;&#1072;. &#1050;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1087;&#1086;&#1081;&#1084;&#1072;&#1090;&#1100; &#1089;&#1074;&#1086;&#1102; &#1076;&#1086;&#1073;&#1099;&#1095;&#1091; &#1080; &#1085;&#1077; &#1087;&#1086;&#1087;&#1072;&#1089;&#1090;&#1100; &#1085;&#1072; &#1084;&#1091;&#1096;&#1082;&#1091; &#1086;&#1093;&#1086;&#1090;&#1085;&#1080;&#1082;&#1072;. &#1050;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083; &#1076;&#1074;&#1080;&#1078;&#1077;&#1090;&#1089;&#1103; &#1082; &#1073;&#1077;&#1088;&#1077;&#1075;&#1091;, &#1087;&#1077;&#1088;&#1077;&#1089;&#1077;&#1082;&#1072;&#1103; &#1088;&#1077;&#1082;&#1091;, &#1089; &#1087;&#1086;&#1089;&#1090;&#1086;&#1103;&#1085;&#1085;&#1086;&#1081; &#1089;&#1082;&#1086;&#1088;&#1086;&#1089;&#1090;&#1100;&#1102;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1087;&#1086;&#1074;&#1086;&#1088;&#1072;&#1095;&#1080;&#1074;&#1072;&#1090;&#1100; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083;&#1072; &#1074;&#1083;&#1077;&#1074;&#1086;/&#1074;&#1087;&#1088;&#1072;&#1074;&#1086;, &#1074;&#1099;&#1073;&#1080;&#1088;&#1072;&#1103; &#1085;&#1072; &#1082;&#1072;&#1082;&#1086;&#1081; &#1091;&#1095;&#1072;&#1089;&#1090;&#1086;&#1082; &#1073;&#1077;&#1088;&#1077;&#1075;&#1072; &#1085;&#1072;&#1087;&#1072;&#1089;&#1090;&#1100;. &#1055;&#1086;&#1076;&#1087;&#1083;&#1099;&#1074; &#1082; &#1073;&#1077;&#1088;&#1077;&#1075;&#1091;, &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083; &#1093;&#1074;&#1072;&#1090;&#1072;&#1077;&#1090; &#1076;&#1086;&#1073;&#1099;&#1095;&#1091;, &#1077;&#1089;&#1083;&#1080; &#1085;&#1072; &#1101;&#1090;&#1086;&#1084; &#1091;&#1095;&#1072;&#1089;&#1090;&#1082;&#1077; &#1077;&#1089;&#1090;&#1100; &#1082;&#1072;&#1082;&#1086;&#1077;-&#1083;&#1080;&#1073;&#1086; &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1086;&#1077;, &#1087;&#1100;&#1102;&#1097;&#1077;&#1077; &#1074;&#1086;&#1076;&#1091; &#1080;&#1079; &#1088;&#1077;&#1082;&#1080;. &#1048;&#1075;&#1088;&#1086;&#1082;&#1091; &#1085;&#1072;&#1095;&#1080;&#1089;&#1083;&#1103;&#1102;&#1090;&#1089;&#1103; &#1086;&#1095;&#1082;&#1080;, &#1074; &#1079;&#1072;&#1074;&#1080;&#1089;&#1080;&#1084;&#1086;&#1089;&#1090;&#1080; &#1086;&#1090; &#1094;&#1077;&#1085;&#1085;&#1086;&#1089;&#1090;&#1080; &#1076;&#1086;&#1073;&#1099;&#1095;&#1080;. &#1053;&#1072; &#1084;&#1077;&#1089;&#1090;&#1077; &#1078;&#1080;&#1074;&#1086;&#1090;&#1085;&#1086;&#1075;&#1086; &#1084;&#1086;&#1078;&#1077;&#1090; &#1086;&#1082;&#1072;&#1079;&#1072;&#1090;&#1100;&#1089;&#1103; &#1086;&#1093;&#1086;&#1090;&#1085;&#1080;&#1082;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1081;, &#1087;&#1086;&#1103;&#1074;&#1080;&#1074;&#1096;&#1080;&#1089;&#1100; &#1085;&#1072; &#1073;&#1077;&#1088;&#1077;&#1075;&#1091;, &#1089;&#1090;&#1088;&#1077;&#1083;&#1103;&#1077;&#1090; &#1074; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083;&#1072;, &#1077;&#1089;&#1083;&#1080; &#1090;&#1086;&#1090; &#1085;&#1072;&#1093;&#1086;&#1076;&#1080;&#1090;&#1089;&#1103; &#1085;&#1072;&#1087;&#1088;&#1086;&#1090;&#1080;&#1074; &#1085;&#1077;&#1075;&#1086;. &#1042; &#1101;&#1090;&#1086;&#1084; &#1089;&#1083;&#1091;&#1095;&#1072;&#1077; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083; &#1087;&#1086;&#1075;&#1080;&#1073;&#1072;&#1077;&#1090;, &#1072; &#1080;&#1075;&#1088;&#1086;&#1082; &#1090;&#1077;&#1088;&#1103;&#1077;&#1090; &#1080;&#1075;&#1088;&#1086;&#1074;&#1091;&#1102; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1091;. &#1045;&#1089;&#1083;&#1080; &#1085;&#1072; &#1091;&#1095;&#1072;&#1089;&#1090;&#1082;&#1077; &#1073;&#1077;&#1088;&#1077;&#1075;&#1072;, &#1082; &#1082;&#1086;&#1090;&#1086;&#1088;&#1086;&#1084;&#1091; &#1073;&#1099;&#1083; &#1085;&#1072;&#1087;&#1088;&#1072;&#1074;&#1083;&#1077;&#1085; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083;, &#1085;&#1077;&#1090; &#1076;&#1086;&#1073;&#1099;&#1095;&#1080;, &#1090;&#1086; &#1082;&#1088;&#1086;&#1082;&#1086;&#1076;&#1080;&#1083; &#1086;&#1089;&#1090;&#1072;&#1077;&#1090;&#1089;&#1103; &#1085;&#1080; &#1089; &#1095;&#1077;&#1084; &#1080; &#1087;&#1086;&#1075;&#1088;&#1091;&#1078;&#1072;&#1077;&#1090;&#1089;&#1103; &#1086;&#1073;&#1088;&#1072;&#1090;&#1085;&#1086; &#1074; &#1074;&#1086;&#1076;&#1091;. &#1044;&#1083;&#1103; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1077;&#1081; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1080; &#1087;&#1088;&#1080;&#1076;&#1077;&#1090;&#1089;&#1103; &#1089;&#1085;&#1086;&#1074;&#1072; &#1087;&#1077;&#1088;&#1077;&#1087;&#1083;&#1099;&#1074;&#1072;&#1090;&#1100; &#1088;&#1077;&#1082;&#1091;, &#1087;&#1086;&#1076;&#1082;&#1088;&#1072;&#1076;&#1099;&#1074;&#1072;&#1103;&#1089;&#1100; &#1080;&#1079;&#1076;&#1072;&#1083;&#1077;&#1082;&#1072;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1087;&#1088;&#1086;&#1084;&#1072;&#1093;&#1085;&#1091;&#1090;&#1100;&#1089;&#1103; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; 20 &#1088;&#1072;&#1079;, &#1087;&#1086;&#1089;&#1083;&#1077; &#1095;&#1077;&#1075;&#1086; &#1086;&#1085; &#1090;&#1077;&#1088;&#1103;&#1077;&#1090; &#1080;&#1075;&#1088;&#1086;&#1074;&#1091;&#1102; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1091;.</rus>\n           <eng>You are a crocodile living in a river. Your task is to catch as many animals on the beach as possible. Time to time the hunter visits the beach and attempts to kill you with a gun.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"waterway\"  title=\"WATER WAY\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1042;&#1099; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090;&#1077; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1077;&#1084;, &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1102;&#1097;&#1080;&#1084; &#1074;&#1086;&#1076;&#1091; &#1076;&#1083;&#1103; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082;&#1086;&#1074;.</rus>\n           <eng>You are an ant collecting dew for its ant heap.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1091;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1090;&#1077; &#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1077;&#1084;, &#1089;&#1086;&#1073;&#1080;&#1088;&#1072;&#1102;&#1097;&#1080;&#1084; &#1074;&#1086;&#1076;&#1091; &#1076;&#1083;&#1103; &#1084;&#1091;&#1088;&#1072;&#1074;&#1077;&#1081;&#1085;&#1080;&#1082;&#1086;&#1074;. &#1042;&#1072;&#1096;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1083;&#1086;&#1074;&#1080;&#1090;&#1100; &#1087;&#1086; &#1086;&#1076;&#1085;&#1086;&#1081; &#1082;&#1072;&#1087;&#1083;&#1077; &#1074;&#1086;&#1076;&#1099; &#1074; &#1083;&#1080;&#1089;&#1090;&#1086;&#1082; &#1080; &#1074;&#1099;&#1083;&#1080;&#1074;&#1072;&#1090;&#1100; &#1077;&#1077; &#1074; &#1094;&#1074;&#1077;&#1090;&#1086;&#1082; &#1074;&#1072;&#1096;&#1077;&#1075;&#1086; &#1085;&#1072;&#1087;&#1072;&#1088;&#1085;&#1080;&#1082;&#1072;-&#1084;&#1091;&#1088;&#1072;&#1074;&#1100;&#1103;. &#1051;&#1080;&#1089;&#1090;&#1086;&#1082; &#1084;&#1086;&#1078;&#1077;&#1090; &#1074;&#1099;&#1076;&#1077;&#1088;&#1078;&#1072;&#1090;&#1100; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1086;&#1076;&#1085;&#1091; &#1082;&#1072;&#1087;&#1083;&#1102;!</rus>\n           <eng>You are an ant collecting dew for its ant heap. Your task is to catch drops with a leaf and pour out it in the flower of your workmate. Remember, the leaf can contain one drop only.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"wildballs\"  title=\"WILD BALLS\" year=\"2004\">\n        <all/>\n\t\t<arcade/>\n\t    <sport/>\n\t    \n\t    <owner id=\"samsungfunclub\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082;  &#1086;&#1089;&#1091;&#1097;&#1077;&#1089;&#1090;&#1074;&#1083;&#1103;&#1077;&#1090; &#1080;&#1075;&#1088;&#1091; &#1074; &#1092;&#1091;&#1090;&#1091;&#1088;&#1080;&#1089;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080;&#1077; &#1082;&#1077;&#1075;&#1083;&#1080; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1074;&#1099;&#1073;&#1080;&#1090;&#1100; &#1082;&#1072;&#1082;  &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1077;&#1075;&#1083;&#1077;&#1081;, &#1079;&#1072;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1103; &#1086;&#1095;&#1082;&#1080; &#1087;&#1088;&#1080; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1085;&#1086;&#1084; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1077; &#1096;&#1072;&#1088;&#1086;&#1074;.</rus>\n           <eng>You should clear as many as possible pins with own balls.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1048;&#1075;&#1088;&#1086;&#1082;  &#1086;&#1089;&#1091;&#1097;&#1077;&#1089;&#1090;&#1074;&#1083;&#1103;&#1077;&#1090; &#1080;&#1075;&#1088;&#1091; &#1074; &#1092;&#1091;&#1090;&#1091;&#1088;&#1080;&#1089;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080;&#1077; &#1082;&#1077;&#1075;&#1083;&#1080; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; &#1074;&#1099;&#1073;&#1080;&#1090;&#1100; &#1082;&#1072;&#1082;  &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1082;&#1077;&#1075;&#1083;&#1077;&#1081;, &#1079;&#1072;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1103; &#1086;&#1095;&#1082;&#1080; &#1087;&#1088;&#1080; &#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1085;&#1086;&#1084; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1077; &#1096;&#1072;&#1088;&#1086;&#1074;. &#1053;&#1086; &#1082;&#1077;&#1075;&#1083;&#1080; &#1085;&#1077;&#1083;&#1100;&#1079;&#1103; &#1089;&#1073;&#1080;&#1074;&#1072;&#1090;&#1100; &#1085;&#1072;&#1087;&#1088;&#1103;&#1084;&#1091;&#1102; &#1089;&#1074;&#1086;&#1080;&#1084; &#1096;&#1072;&#1088;&#1086;&#1084;, &#1087;&#1086;&#1101;&#1090;&#1086;&#1084;&#1091; &#1087;&#1077;&#1088;&#1080;&#1086;&#1076;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1089;&#1083;&#1091;&#1095;&#1072;&#1081;&#1085;&#1099;&#1084; &#1086;&#1073;&#1088;&#1072;&#1079;&#1086;&#1084;, &#1101;&#1082;&#1088;&#1072;&#1085; &#1087;&#1077;&#1088;&#1077;&#1089;&#1077;&#1082;&#1072;&#1102;&#1090; &#1096;&#1072;&#1088;&#1099;, &#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1080;&#1075;&#1088;&#1086;&#1082; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1085;&#1072;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100; &#1085;&#1072; &#1082;&#1077;&#1075;&#1083;&#1080;, &#1087;&#1086;&#1089;&#1088;&#1077;&#1076;&#1089;&#1090;&#1074;&#1086;&#1084; &#1091;&#1076;&#1072;&#1088;&#1072; &#1089;&#1074;&#1086;&#1080;&#1084; &#1096;&#1072;&#1088;&#1086;&#1084; &#1080; &#1080;&#1079;&#1084;&#1077;&#1085;&#1077;&#1085;&#1080;&#1103; &#1090;&#1088;&#1072;&#1077;&#1082;&#1090;&#1086;&#1088;&#1080;&#1080; &#1082;&#1072;&#1090;&#1103;&#1097;&#1077;&#1075;&#1086;&#1089;&#1103; &#1096;&#1072;&#1088;&#1072;. &#1045;&#1089;&#1083;&#1080; &#1080;&#1075;&#1088;&#1086;&#1082; &#1087;&#1088;&#1086;&#1084;&#1072;&#1093;&#1085;&#1077;&#1090;&#1089;&#1103; &#1084;&#1080;&#1084;&#1086; &#1082;&#1072;&#1090;&#1103;&#1097;&#1077;&#1075;&#1086;&#1089;&#1103; &#1096;&#1072;&#1088;&#1072;, &#1090;&#1086; &#1077;&#1075;&#1086; &#1096;&#1072;&#1088; &#1088;&#1072;&#1079;&#1086;&#1073;&#1100;&#1077;&#1090;&#1089;&#1103; &#1086; &#1087;&#1086;&#1076;&#1085;&#1103;&#1074;&#1096;&#1091;&#1102;&#1089;&#1103; &#1089;&#1090;&#1077;&#1085;&#1082;&#1091; &#1080; &#1086;&#1076;&#1085;&#1072; &#1080;&#1075;&#1088;&#1086;&#1074;&#1072;&#1103; &#1087;&#1086;&#1087;&#1099;&#1090;&#1082;&#1072; &#1073;&#1091;&#1076;&#1077;&#1090; &#1089;&#1085;&#1103;&#1090;&#1072;.</rus>\n           <eng>You should clear as many as possible pins with own balls. You must use a rolling ball to clear pins; you have to direct the ball at a pin with your ball. If you miss, your ball will be lost.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <samsung family=\"group3\"/>\n            <samsung family=\"group4\"/>\n            <samsung family=\"group5\"/>\n        </devices>\n\t</game>\n\n     <game id=\"mtvpuzzle\"  title=\"MTV PUZZLE\" year=\"2005\">\n        <all/>\n\t\t<logic/>\n\t    \n\t    <owner id=\"mtv\"/>\n\n        <shortreference>\n           <rus>&#1048;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1072;&#1103; &#1080;&#1075;&#1088;&#1072; 15 &#1085;&#1072; &#1090;&#1077;&#1084;&#1091; MTV.</rus>\n           <eng>A puzzle game.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1072;&#1096;&#1072; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072;-&#1087;&#1077;&#1088;&#1077;&#1076;&#1074;&#1080;&#1075;&#1072;&#1103; &#1082;&#1074;&#1072;&#1076;&#1088;&#1072;&#1090;&#1080;&#1082;&#1080;,&#1089;&#1086;&#1073;&#1088;&#1072;&#1090;&#1100; &#1080;&#1079;&#1085;&#1072;&#1095;&#1072;&#1083;&#1100;&#1085;&#1091;&#1102; &#1082;&#1072;&#1088;&#1090;&#1080;&#1085;&#1082;&#1091; &#1079;&#1072; &#1084;&#1080;&#1085;&#1080;&#1084;&#1072;&#1083;&#1100;&#1085;&#1086;&#1077; &#1082;&#1086;&#1083;&#1080;&#1095;&#1077;&#1089;&#1090;&#1074;&#1086; &#1093;&#1086;&#1076;&#1086;&#1074;. &#1048;&#1084;&#1077;&#1077;&#1090;&#1089;&#1103; &#1090;&#1088;&#1080; &#1091;&#1088;&#1086;&#1074;&#1085;&#1103; &#1089;&#1083;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1080; &#1087;&#1086;&#1083;&#1103;: 3&#1093;3,4&#1093;4 &#1080; 5&#1093;5.</rus>\n           <eng>Your task is to collect a full image with moved squares.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n        </devices>\n\t</game>\n\n     <game id=\"mtvpaparazzo\"  title=\"PAPARAZZO\" year=\"2005\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"mtv\"/>\n\n        <shortreference>\n           <rus>&#1053;&#1072;&#1097;&#1077;&#1083;&#1082;&#1072;&#1081; &#1082;&#1072;&#1082; &#1084;&#1086;&#1078;&#1085;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1077; &#1079;&#1074;&#1077;&#1079;&#1076; &#1085;&#1072; &#1089;&#1074;&#1086;&#1081; &#1092;&#1086;&#1090;&#1080;&#1082;...</rus>\n           <eng>You are a paparazzo and your task to get as many photos of celebrities as possible.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1076;&#1086;&#1083;&#1078;&#1085;&#1099; &#1092;&#1086;&#1090;&#1086;&#1075;&#1088;&#1072;&#1092;&#1080;&#1088;&#1086;&#1074;&#1072;&#1090;&#1100; &#1083;&#1080;&#1094;&#1072; &#1079;&#1085;&#1072;&#1084;&#1077;&#1085;&#1080;&#1090;&#1086;&#1089;&#1090;&#1077;&#1081; &#1096;&#1086;&#1091;-&#1073;&#1080;&#1079;&#1085;&#1077;&#1089;&#1072;,&#1080;&#1084;&#1077;&#1102;&#1097;&#1080;&#1093; &#1079;&#1085;&#1072;&#1082; '&#1079;&#1074;&#1077;&#1079;&#1076;&#1099;' &#1080; &#1080;&#1079;&#1073;&#1077;&#1075;&#1072;&#1090;&#1100; &#1086;&#1093;&#1088;&#1072;&#1085;&#1085;&#1080;&#1082;&#1086;&#1074; &#1074; &#1086;&#1082;&#1085;&#1072;&#1093;. &#1042;&#1072;&#1096;&#1077; &#1074;&#1088;&#1077;&#1084;&#1103; &#1080; &#1095;&#1080;&#1089;&#1083;&#1086; &#1082;&#1072;&#1076;&#1088;&#1086;&#1074;-&#1086;&#1075;&#1088;&#1072;&#1085;&#1080;&#1095;&#1077;&#1085;&#1099;.</rus>\n           <eng>You are a paparazzo and your task to get as many photos of celebrities as possible.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n        </devices>\n\t</game>\n\n     <game id=\"mtvpillow\"  title=\"PILLOW\" year=\"2005\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"mtv\"/>\n\n        <shortreference>\n           <rus>&#1053;&#1077; &#1083;&#1102;&#1073;&#1080;&#1096;&#1100; &#1074;&#1080;&#1076;&#1078;&#1077;&#1077;&#1074;? &#1053;&#1091; &#1090;&#1086;&#1075;&#1076;&#1072; &#1087;&#1086;&#1076;&#1091;&#1096;&#1082;&#1091; &#1074; &#1088;&#1091;&#1082;&#1080; &#1080; &#1087;&#1086;&#1096;&#1083;&#1080; &#1086;&#1090;&#1088;&#1099;&#1074;&#1072;&#1090;&#1100;&#1089;&#1103; &#1074; &#1086;&#1092;&#1080;&#1089;&#1077; &#1052;&#1058;&#1042;...</rus>\n           <eng>You're a visitor of MTV office and your task is to belabour music stars by a pillow.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1058;&#1099; &#1093;&#1086;&#1076;&#1080;&#1096;&#1100; &#1087;&#1086; &#1086;&#1092;&#1080;&#1089;&#1091; MTV &#1080; &#1076;&#1091;&#1073;&#1072;&#1089;&#1080;&#1096;&#1100; &#1074;&#1089;&#1077;&#1093; &#1087;&#1086;&#1076;&#1091;&#1096;&#1082;&#1086;&#1081;.&#1054;&#1087;&#1072;&#1089;&#1072;&#1081;&#1089;&#1103; &#1086;&#1093;&#1088;&#1072;&#1085;&#1085;&#1080;&#1082;&#1086;&#1074; &#1089; &#1076;&#1091;&#1073;&#1080;&#1085;&#1082;&#1072;&#1084;&#1080;.&#1047;&#1072;&#1093;&#1086;&#1076;&#1080; &#1074; &#1076;&#1074;&#1077;&#1088;&#1080;,&#1090;&#1072;&#1084; &#1084;&#1086;&#1075;&#1091;&#1090; &#1073;&#1099;&#1090;&#1100; &#1087;&#1086;&#1076;&#1091;&#1096;&#1082;&#1080;.&#1051;&#1086;&#1074;&#1080; &#1089;&#1077;&#1088;&#1076;&#1094;&#1072;-&#1101;&#1090;&#1086; &#1078;&#1080;&#1079;&#1085;&#1080;.</rus>\n           <eng>You're a visitor of MTV office and your task is to belabour music stars by a pillow.You can find new pillows in rooms.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n        </devices>\n\t</game>\n\n     <game id=\"mtvstage\"  title=\"HOLD OUT ON THE STAGE\" year=\"2005\">\n        <all/>\n\t\t<arcade/>\n\t    \n\t    <owner id=\"mtv\"/>\n\n        <shortreference>\n           <rus>&#1055;&#1077;&#1090;&#1100; &#1084;&#1099; &#1074;&#1089;&#1077; &#1083;&#1102;&#1073;&#1080;&#1084;, &#1085;&#1086; &#1085;&#1077; &#1091; &#1074;&#1089;&#1077;&#1093; &#1077;&#1089;&#1090;&#1100; &#1089;&#1083;&#1091;&#1093;. &#1043;&#1083;&#1072;&#1074;&#1085;&#1086;&#1077; - &#1091;&#1074;&#1086;&#1088;&#1072;&#1095;&#1080;&#1074;&#1072;&#1090;&#1100;&#1089;&#1103; &#1086;&#1090; &#1090;&#1103;&#1078;&#1077;&#1083;&#1099;&#1093; &#1087;&#1088;&#1077;&#1076;&#1084;&#1077;&#1090;&#1086;&#1074;...</rus>\n           <eng>You are a rock-star and your worshipper throw different things on your stage.</eng>\n\t    </shortreference>\n\n\t    <reference>\n           <rus>&#1042;&#1099; &#1076;&#1086;&#1083;&#1078;&#1085;&#1099; &#1087;&#1088;&#1086;&#1076;&#1077;&#1088;&#1078;&#1072;&#1090;&#1100;&#1089;&#1103; &#1085;&#1072; &#1089;&#1094;&#1077;&#1085;&#1077; &#1086;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1077;&#1085;&#1085;&#1086;&#1077; &#1074;&#1088;&#1077;&#1084;&#1103;,&#1091;&#1074;&#1086;&#1088;&#1072;&#1095;&#1080;&#1074;&#1072;&#1103;&#1089;&#1100; &#1086;&#1090; &#1075;&#1088;&#1072;&#1076;&#1072; &#1086;&#1087;&#1072;&#1089;&#1085;&#1099;&#1093; &#1087;&#1088;&#1077;&#1076;&#1084;&#1077;&#1090;&#1086;&#1074;,&#1083;&#1077;&#1090;&#1103;&#1097;&#1080;&#1093; &#1080;&#1079; &#1079;&#1072;&#1083;&#1072;.&#1051;&#1086;&#1074;&#1080;&#1090;&#1077; &#1090;&#1086;&#1083;&#1100;&#1082;&#1086; &#1094;&#1074;&#1077;&#1090;&#1099; &#1074;&#1072;&#1096;&#1080;&#1093; &#1092;&#1072;&#1085;&#1072;&#1090;&#1086;&#1074; &#1080; &#1079;&#1072;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1081;&#1090;&#1077; &#1101;&#1090;&#1080;&#1084; &#1086;&#1095;&#1082;&#1080;.</rus>\n           <eng>You are a rock-star and your worshipper throw different things on your stage.You have to avoid collision with bad things and catch flowers.</eng>\n\t    </reference>\n\t\t\n\t\t<sales>\n\t\t</sales>\n        \n        <devices>\n            <motorola family=\"seriesC380\"/>\n            <motorola family=\"seriesE398\"/>\n        </devices>\n\t</game>\n\n\t</games>\n</data>"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/hotnews.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>NEWS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n</head>\n<body>\n//#+\n//#local l_cnewsNewsFile = xml_root(xml_open(\"hotnews.xml\"))\n//#local l_cnewsNewsList = xml_list(l_cnewsNewsFile,\"news\") \n<table width=\"100%\"  border=\"0\" align=\"center\" cellpadding=\"4\" cellspacing=\"0\">\n//#local l_cnewsIndex = 0\n//#while l_cnewsIndex<xml_size(l_cnewsNewsList)\n//#local l_cnewsCurNews = xml_get(l_cnewsNewsList,l_cnewsIndex)\n//#local l_cnewsCurNews = xml_get(xml_list(l_cnewsCurNews,curLangID),0)\n//#local l_cnewsName = xml_text(xml_get(xml_list(l_cnewsCurNews,\"name\"),0))\n//#local l_cnewsContent = xml_text(xml_get(xml_list(l_cnewsCurNews,\"content\"),0))\n//#local l_cnewsRef = xml_text(xml_get(xml_list(l_cnewsCurNews,\"href\"),0))\n<tr> \n<td class=\"rightnews\" ><div align=\"center\"><span class=\"rightnewsHdr\">/*$l_cnewsName$*/</span><br>\n</div>\n<div align=\"justify\">/*$l_cnewsContent$*/<br>\n//#if curLangID==\"rus\"\n<span class=\"rightnewsHdr\"><a href=\"/*$l_cnewsRef$*/\" target=\"_new\"> ...</a></div></td>\n//#else\n<span class=\"rightnewsHdr\"><a href=\"/*$l_cnewsRef$*/\" target=\"_new\">read more...</a></div></td>\n//#endif\n</tr>\n//#local l_cnewsIndex = l_cnewsIndex + 1 \n//#end\n</table>\n//#-\n</body>\n</html>\n//#+"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/hotnews.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hotnews>\n\t<news>\n  \t\t<rus>\n  \t\t   <name>Papanin's quest</name>\n  \t\t   <content>&#1059;&#1074;&#1083;&#1077;&#1082;&#1072;&#1090;&#1077;&#1083;&#1100;&#1085;&#1072;&#1103; &#1080;&#1075;&#1088;&#1072; \"Papanin's quest\" &#1076;&#1083;&#1103; Nokia Series 60, &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1085;&#1072; &#1085;&#1072; Playmobile.</content>\n  \t\t   <href>http://www.playmobile.ru/games/arcade/Papanins_Quest</href>\n  \t\t</rus>\n        <eng>\n  \t\t   <name>Papanin's quest</name>\n  \t\t   <content>The Papanin's quest game for Nokia Series 60 has been available on Playmobile.</content>\n           <href>http://www.playmobile.ru/games/arcade/Papanins_Quest</href>\n  \t\t</eng>\n\t</news>\n    <news>\n  \t\t<rus>\n  \t\t   <name>Mobile chase</name>\n  \t\t   <content>&#1059;&#1074;&#1083;&#1077;&#1082;&#1072;&#1090;&#1077;&#1083;&#1100;&#1085;&#1077;&#1081;&#1096;&#1072;&#1103; &#1075;&#1086;&#1085;&#1082;&#1072; &#1089; &#1101;&#1083;&#1077;&#1084;&#1077;&#1085;&#1090;&#1072;&#1084;&#1080; &#1096;&#1091;&#1090;&#1077;&#1088;&#1072; \"Mobile Chase\" &#1076;&#1083;&#1103; Nokia Series 60, &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1085;&#1072; &#1085;&#1072; Playmobile.</content>\n  \t\t   <href>http://www.playmobile.ru/games/race/Mobile_Chase</href>\n  \t\t</rus>\n        <eng>\n  \t\t   <name>Mobile chase</name>\n  \t\t   <content>Super racing game \"Mobile Chase\" (contains elements of shooter) for Nokia Series 60 has been available on Playmobile.</content>\n           <href>http://www.playmobile.ru/games/race/Mobile_Chase</href>\n  \t\t</eng>\n\t</news>\n    <news>\n  \t\t<rus>\n  \t\t   <name>Air aggression</name>\n  \t\t   <content>&#1040;&#1088;&#1082;&#1072;&#1076;&#1072; \"Air aggression\" &#1076;&#1083;&#1103; Nokia Series 60, &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1085;&#1072; &#1085;&#1072; Playmobile.</content>\n  \t\t   <href>http://www.playmobile.ru/games/shooter/Air_Aggression</href>\n  \t\t</rus>\n        <eng>\n  \t\t   <name>Air aggression</name>\n  \t\t   <content>The arcade game \"Air aggression\" for Nokia Series 60 has been available on Playmobile.</content>\n           <href>http://www.playmobile.ru/games/shooter/Air_Aggression</href>\n  \t\t</eng>\n\t</news>\n    <news>\n  \t\t<rus>\n  \t\t   <name>Caspian monster</name>\n  \t\t   <content>&#1054;&#1095;&#1077;&#1085;&#1100; &#1082;&#1088;&#1072;&#1089;&#1086;&#1095;&#1085;&#1099;&#1081; &#1089;&#1082;&#1088;&#1086;&#1083;&#1083;&#1096;&#1091;&#1090;&#1077;&#1088; \"Caspian monster\" &#1076;&#1083;&#1103; Nokia Series 60, &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1077;&#1085; &#1085;&#1072; Playmobile.</content>\n  \t\t   <href>http://www.playmobile.ru/games/shooter/Caspian_monster</href>\n  \t\t</rus>\n        <eng>\n  \t\t   <name>Caspian monster</name>\n  \t\t   <content>The scrollshooter \"Caspian monster\" for Nokia Series 60 has been available on Playmobile.</content>\n           <href>http://www.playmobile.ru/games/shooter/Caspian_monster</href>\n  \t\t</eng>\n\t</news>\n    <news>\n  \t\t<rus>\n  \t\t   <name>Kalah</name>\n  \t\t   <content>&#1042;&#1086;&#1089;&#1090;&#1086;&#1095;&#1085;&#1072;&#1103; &#1080;&#1075;&#1088;&#1072; &#1050;&#1072;&#1083;&#1072;&#1093;, &#1090;&#1077;&#1087;&#1077;&#1088;&#1100; &#1080;&#1084;&#1077;&#1077;&#1090; &#1089;&#1074;&#1086;&#1102; &#1091;&#1085;&#1080;&#1082;&#1072;&#1083;&#1100;&#1085;&#1091;&#1102; &#1080;&#1085;&#1090;&#1077;&#1088;&#1087;&#1088;&#1077;&#1090;&#1072;&#1094;&#1080;&#1102; &#1085;&#1072; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1099;&#1093; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1072;&#1093; Nokia Series 60 &#1080; &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1085;&#1072; &#1085;&#1072; Playmobile.</content>\n  \t\t   <href>http://www.playmobile.ru/games/logic/Kalah</href>\n  \t\t</rus>\n        <eng>\n  \t\t   <name>Kalah</name>\n  \t\t   <content>The east game Kalah has excellent mobile verison for Nokia Series 60 what has been available on Playmobile</content>\n           <href>http://www.playmobile.ru/games/logic/Kalah</href>\n  \t\t</eng>\n\t</news>\n</hotnews>"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/index.htm",
    "content": "<html>\n<head>\n<script language=\"JavaScript\"> \n<!-- \nwindow.location.href = \"./rus/menu1_news.htm\"\n// --> \n</script>\n\n<title>ColdCore official site</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\"></head>\n\n<body bgcolor=\"#FFFFFF\">\n<table width=\"100%%\" height=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n  <tr>\n    <td align=\"center\" valign=\"middle\"> \n      <table width=\"100%%\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n        <tr>\n    <td><div align=\"center\"><a href=\"./rus/menu1_news.htm\"><img src=\"cc.gif\" width=\"55\" height=\"42\" border=\"0\"></a></div></td>\n  </tr>\n  <tr>\n    <td><div align=\"center\"><strong><font color=\"#0099CC\">Cold Core</font></strong></div></td>\n  </tr>\n</table>\t\n\t</td>\n  </tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/job.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body>\n//#+\n<p align=\"center\"><strong><em><font size=\"4\">Sorry, but the page is still under \n  construction....</font></em></strong></p>\n<p align=\"center\"><img src=\"../undercon.gif\" width=\"40\" height=\"38\"></p>\n<p align=\"center\"><strong><font size=\"4\"><em>Visit us later, please...</em></font></strong></p>\n\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/loadpages/muzon_AirBoil.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n<HTML><HEAD><TITLE>Java-: Air Boil</TITLE>\n<META http-equiv=Content-Type content=\"text/html; charset=windows-1251\"><LINK \nhref=\"Java- Star Harbor_files/style.css\" type=text/css rel=stylesheet>\n<META content=\"MSHTML 6.00.2800.1505\" name=GENERATOR></HEAD>\n<BODY>\n<TABLE height=\"100%\" cellSpacing=10 cellPadding=0 width=\"100%\" align=center \nborder=0 valign=\"top\">\n  <TBODY>\n  <TR>\n    <TD vAlign=top align=middle width=120><B>Air Boil<BR></B><BR>\n      <HR color=#eeeeee noShade>\n      <IMG src=\"../games/airboil_scr3.gif\"> \n      <HR color=#eeeeee noShade>\n      <FONT color=#ffffff size=+1></FONT><BR><FONT color=red \n      size=+1>5008485</FONT> </TD>\n    <TD vAlign=top align=left><FONT size=+1> ?</FONT> <BR>\n      <P>\n      <P>  SMS-.</P>\n      <P>    <B>5008485</B></P>\n      <P> SMS-       \n:<BR>\n      <TABLE borderColor=#000000 cellSpacing=0 cellPadding=4 border=1 noshade \n      table>\n        <TBODY>\n        <TR>\n          <TD width=151 height=40></TD>\n          <TD>  </TD>\n          <TD> </TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>-</TD>\n          <TD align=middle><FONT color=red size=+1>9998</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>, , , , , , , \n             , , , , , , \n            , , , , , , , \n          </TD>\n          <TD align=middle><FONT color=red size=+1>9998</FONT></TD></TR></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mega_logo.gif\" width=151></TD><!-- -->\n          <TD>-</TD>\n          <TD align=middle><FONT color=red size=+1>9998</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/bee_logo.gif\" width=64></TD><!-- -->\n          <TD>   , , , , , \n            , , , , , , , \n            , , , , , -,  \n             , , , , , , , \n            , -,  , , ,  \n             ,  , ,  , , \n            , , , , , - \n            , ,  </TD>\n          <TD align=middle><FONT color=red \n      size=+1>9998</FONT></TD></TR></TBODY></TABLE></P>\n      <P class=small>  SMS-    \n        $2,50   . </P>\n      <P>     WAP-,<BR>  \n      <BR>(    ).</P>\n      <P> :<BR><B>Motorola: C380, C650, v220, v180, v300, \n      v500, v600, v535, v550, v620, E398, E375, v3<BR>Nokia: 3510i, 7210, \n      3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, \n      6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i, 6230, 5140, 5140, \n      6170, 6255, 6020, 7260, 7270, 3650, 3600, 3620, 3660, 7650, N-Gage, \n      N-GageQD, 7610, 6260, 6670, 3230<BR>Samsung: C100, C108T, C110, S300, \n      S300M, S307, E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, \n      E820, X460, X468, X100, X108, X600, X608<BR>Siemens: M55, C60, MC60, S55, SL55, S65, CX65, \n      CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65, C65, \n      SL65<BR>LG: G1600<BR>Sony Ericsson: T610, T616, T618, T628, T630, T637, \n      Z600, Z608<BR></B><BR></P>\n      <P></P></TD></TR></TBODY></TABLE>\n<HR color=#666666 noShade>\n</BODY></HTML>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/loadpages/muzon_StarHarbor.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n<!-- saved from url=(0056)http://www.muzon.ru/game_preview.jsp?cat=all&type=p&id=1 -->\n<HTML><HEAD><TITLE>Java-: Star Harbor</TITLE>\n<META http-equiv=Content-Type content=\"text/html; charset=windows-1251\"><LINK \nhref=\"Java- Star Harbor_files/style.css\" type=text/css rel=stylesheet>\n<META content=\"MSHTML 6.00.2800.1505\" name=GENERATOR></HEAD>\n<BODY>\n<TABLE height=\"100%\" cellSpacing=10 cellPadding=0 width=\"100%\" align=center \nborder=0 valign=\"top\">\n  <TBODY>\n  <TR>\n    <TD vAlign=top align=middle width=120><B>Star Harbor<BR></B><BR>\n      <HR color=#eeeeee noShade>\n      <IMG src=\"../games/starharbor_scr3.gif\"> \n      <HR color=#eeeeee noShade>\n      <FONT color=#ffffff size=+1></FONT><BR><FONT color=red \n      size=+1>5006971</FONT> </TD>\n    <TD vAlign=top align=left><FONT size=+1> ?</FONT> <BR>\n      <P>\n      <P>  SMS-.</P>\n      <P>    <B>5006971</B></P>\n      <P> SMS-       \n:<BR>\n      <TABLE borderColor=#000000 cellSpacing=0 cellPadding=4 border=1 noshade \n      table>\n        <TBODY>\n        <TR>\n          <TD width=151 height=40></TD>\n          <TD>  </TD>\n          <TD> </TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>-</TD>\n          <TD align=middle><FONT color=red size=+1>4012</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mts_logo.gif\" width=72></TD><!-- -->\n          <TD>, , , , , , , \n             , , , , , , \n            , , , , , , , \n          </TD>\n          <TD align=middle><FONT color=red size=+1>4012</FONT></TD></TR></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/mega_logo.gif\" width=151></TD><!-- -->\n          <TD>-</TD>\n          <TD align=middle><FONT color=red size=+1>4012</FONT></TD></TR>\n        <TR>\n          <TD align=middle><IMG height=40 \n            src=\"../logos/bee_logo.gif\" width=64></TD><!-- -->\n          <TD>   , , , , , \n            , , , , , , , \n            , , , , , -,  \n             , , , , , , , \n            , -,  , , ,  \n             ,  , ,  , , \n            , , , , , - \n            , ,  </TD>\n          <TD align=middle><FONT color=red \n      size=+1>4012</FONT></TD></TR></TBODY></TABLE></P>\n      <P class=small>  SMS-    \n        $2,50   . </P>\n      <P>     WAP-,<BR>  \n      <BR>(    ).</P>\n      <P> :<BR><B>Motorola: C380, C650, v220, v180, v300, \n      v500, v600, v535, v550, v620, E398, E375, v3<BR>Nokia: 3410, 3510i, 7210, \n      3100, 3105, 3108, 3120, 3125, 3200, 3205, 3300, 5100, 6100, 6108, 6200, \n      6220, 6225, 6585, 6610, 6610i, 6800, 7200, 7250,7250i, 6230, 5140, 5140, \n      6170, 6255, 6020, 7260, 7270, 3650, 3600, 3620, 3660, 7650, N-Gage, \n      N-GageQD, 7610, 6260, 6670, 3230<BR>Samsung: C100, C108T, C110, S300, \n      S300M, S307, E100, E108, E330, E338, E630, E638, E700, E708, E800, E808, \n      E820, X460, X468, X100, X108, X600, X608<BR>Siemens: M(T)50, C55, C56, \n      CT56, 6688i, M46, 3118, SL45i, M55, C60, MC60, S55, SL55, S65, CX65, \n      CXT65, CXV65, CX66, CX70, M65, M6V, M6C, S6V, S6C, S66, SK65, C65, \n      SL65<BR>LG: G1600<BR>Sony Ericsson: T610, T616, T618, T628, T630, T637, \n      Z600, Z608<BR></B><BR></P>\n      <P></P></TD></TR></TBODY></TABLE>\n<HR color=#666666 noShade>\n</BODY></HTML>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/main.htm",
    "content": "//#local site_file = xml_root(xml_open(\"site.xml\"))\n//#local games_file = xml_root(xml_open(\"games.xml\"))\n//#local games_list = xml_list(xml_get(xml_list(games_file,\"games\"),0),\"game\")\n\n//#local languages= xml_list(xml_get(xml_list(site_file,\"languages\"),0),\"lang\")\n//#local langsNumber = xml_size(languages)\n\n//#local langIndex = 0\n\n//#while langIndex<langsNumber\n//#local curLangID = xml_attr(xml_get(languages,langIndex),\"id\")\n//#local curLangText = xml_attr(xml_get(languages,langIndex),\"text\")\n\n//#local outFileName = \"index.htm\"\n\n//#echo Language /*$curLangText$*/\n//#outdir curLangID\n\n//#local menuMainIndex = 1\n//#local menuList = 0\n\n\n//#while menuMainIndex>0\n\n//#local menuList = xml_list(site_file,\"menu\"+menuMainIndex)\n//#if xml_size(menuList)==0\n\t//#local menuList=-1\n\t//#local menuMainIndex = -1\n\t//#continue\n//#endif\t\n//#local menuList = xml_get(menuList,0)\n\n//#local menuSubIndex = 0\n//#local submenuList = xml_list(menuList,\"item\")\n//#local rootMenuNameText = xml_list(menuList,\"textname\")\n//#local rootMenuNameID = \"menu\"+menuMainIndex\n//#if xml_size(rootMenuNameText)==0\n\t//#local rootMenuNameText=\"\"\n//#else\n\t//#local rootMenuNameText = xml_get(rootMenuNameText,0)\n\t//#local rootMenuNameText=str2web(xml_text(xml_get(xml_list(rootMenuNameText,curLangID),0)))\n//#endif\n\n//#local submenuItemsNumber = xml_size(submenuList)\n//#echo SUBITEMS: /*$submenuItemsNumber$*/\n//#while menuSubIndex<submenuItemsNumber\n\n//#local currentItem = xml_get(submenuList,menuSubIndex)\n//#local currentItemID = xml_attr(currentItem,\"id\")\n\n//#local currentItemText = str2web(xml_text(xml_get(xml_list(currentItem,curLangID),0)))\n//#outname rootMenuNameID+\"_\"+currentItemID + \".htm\"\n//#echo making file /*$rootMenuNameID+\"_\"+currentItemID + \".htm\"$*/\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n\n//#local pageHeader = str2web(xml_text(xml_get(xml_list(xml_get(xml_list(site_file,\"header\"),0),curLangID),0)))\n//#if strlen(rootMenuNameText)==0\n//#local rootMenuNameText2=\"/\"\n//#else\n//#local rootMenuNameText2=\"/\"+rootMenuNameText+\"/\"\n//#endif\n<title>/*$pageHeader+rootMenuNameText2+currentItemText$*/</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n\n</head>\n\n<body>\n<table width=\"720\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"5\" bgcolor=\"#FFFFFF\">\n  <tr>\n    <td height=\"129\" bgcolor=\"#FFFFFF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n      <tr>\n        <td><div align=\"left\"><img src=\"../cc_lft.jpg\" alt=\"ColdCore(R)\" width=\"330\" height=\"129\"></div></td>\n        <td>&nbsp;</td>\n        <td><div align=\"right\"><img src=\"../cc_rght.jpg\" alt=\"Buy a bit of Game(TM)\" width=\"329\" height=\"129\"></div></td>\n      </tr>\n    </table></td>\n  </tr>\n  <tr>\n    <td>\n\t<table width=\"100%%\"  border=\"0\" cellspacing=\"8\" cellpadding=\"0\">\n        <tr>\n          <td width=\"150\" align=\"left\" valign=\"top\"> \n            <table width=\"150\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr align=\"center\"> \n                <td colspan=\"3\" bgcolor=\"#3E0072\"><span class=\"menuheader\"></span><span class=\"menuheader\"> \n                  </span> <table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n                    <tr> \n                      <td bgcolor=\"#0F87FF\" class=\"menuheader\">\n\t\t\t\t\t\t//#if curLangID==\"eng\"\n\t\t\t\t\t\t\t<div align=\"center\">MENU</div></td>\n    \t\t\t\t\t//#else\n    \t\t\t\t\t\t//#if curLangID==\"rus\"\n    \t\t\t\t\t    <div align=\"center\">&#1053;&#1040;&#1042;&#1048;&#1043;&#1040;&#1062;&#1048;&#1071;</div></td>\n    \t\t\t\t\t    //#endif\n    \t\t\t\t\t//#endif\n                    </tr>\n                  </table></td>\n              </tr>\n              <tr> \n                <td width=\"10\" bgcolor=\"#3E0072\">\n\t\t\t\t\t<p><strong class=\"menuheader\"></strong></p></td>\n                <td width=\"130\" bgcolor=\"#3E0072\" class=\"menu\"><span class=\"menu\"><strong class=\"menuheader\"><span class=\"menu\">&nbsp;</span></strong></span><strong class=\"menuheader\"><br></strong>\n                  \n//#local l_menuIndex = 1\n//#while true \n//#local l_mainMenuList = xml_list(site_file,\"menu\"+l_menuIndex)\n//#if xml_size(l_mainMenuList)==0\n//#break\n//#endif\n\n//#local l_curMenu = xml_get(l_mainMenuList,0)\n//#local l_subelementsMenu = xml_list(l_curMenu,\"item\")\n//#local l_menuName = xml_list(l_curMenu,\"textname\")\n//#if xml_size(l_menuName)==0\n  //#local l_spacer = \"\"\n  //#local l_menuName = \"\"\n//#else\n  //#local l_spacer = \"&nbsp;&nbsp;&nbsp;\"\n  //#local l_menuName = xml_text(xml_get(xml_list(xml_get(l_menuName,0),curLangID),0))\n//#endif\n<div>\n//#if strlen(l_menuName)>0\n/*$l_menuName$*/<br>\n//#endif\n//#local l_subMenuItem = 0\n//#while l_subMenuItem<xml_size(l_subelementsMenu)           \n    //#local l_curSubItem = xml_get(l_subelementsMenu,l_subMenuItem)       \n\t//#local l_menuName = xml_text(xml_get(xml_list(l_curSubItem,curLangID),0))       \n\t//#local l_menuID = xml_attr(l_curSubItem,\"id\")\n\n    //#local l_appsNumber = -1\n    \n    //#if l_menuIndex>1\n    \t//#local l_appsNumber = 0\n    \t//#local l_gIndex = 0\n    \t//#while l_gIndex<xml_size(games_list)\n    \t\t//#local l_curGame = xml_get(games_list,l_gIndex)\n    \t\t//#if xml_size(xml_list(l_curGame,l_menuID))>0\n\t    \t\t//#local l_appsNumber = l_appsNumber+1\n    \t\t//#endif\n    \t\t//#local l_gIndex = l_gIndex+1\n    \t//#end\n    //#endif\n    //#if l_appsNumber<0\n\t    //#local l_stringGamesNumber = \"\"\n    //#else\n    \t//#local l_stringGamesNumber = \"&nbsp;(\"+l_appsNumber+\")\"\n    //#endif\n\n\t//#if menuSubIndex == l_subMenuItem && menuMainIndex == l_menuIndex\n      /*$l_spacer$*/<img src=\"../ledon.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\">/*$l_menuName+l_stringGamesNumber$*/<br>\n\t//#else\n      /*$l_spacer$*/<img src=\"../ledoff.gif\" width=\"10\" height=\"10\" hspace=\"2\" vspace=\"2\" align=\"absmiddle\"><a href=\"/*$\"./\"+\"menu\"+l_menuIndex+\"_\"+l_menuID + \".htm\"$*/\">/*$l_menuName+l_stringGamesNumber$*/</a><br>\n\t//#endif\n//#local l_subMenuItem = l_subMenuItem + 1\n//#end\n<br></div>\n//#local l_menuIndex = l_menuIndex + 1\n//#end\n</td>\n</tr>\n<tr> \n<td colspan=\"2\" bgcolor=\"#0066FF\"><table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"4\">\n<tr class=\"langtxt\"> \n//#local li = 0\n//#while li<langsNumber\n\t//#local locLangID = xml_attr(xml_get(languages,li),\"id\")\n\t//#local locLangText = xml_attr(xml_get(languages,li),\"text\")\n\n\t//#if li==langIndex\n    \t<td bgcolor=\"#3E0072\"> <div align=\"center\"><font color=\"#00FF00\">/*$locLangText$*/</font></div></td>\n\t//#else\n        <td bgcolor=\"#6A6AFF\"><div align=\"center\"><a href=\"/*$\"../\"+locLangID+\"/\"+rootMenuNameID+\"_\"+currentItemID+\".htm\"$*/\">/*$locLangText$*/</a></div></td>\n\t//#endif\n//#local li = li +1\n//#end\n                    </tr>\n                  </table></td>\n              </tr>\n            </table>\n            <br>\n            &nbsp; </td>\n          <td width=\"391\" align=\"center\" valign=\"top\" bgcolor=\"#FFFFFF\" class=\"menuheader\"> \n            <div>\n              <div align=\"center\" class=\"menuheader\"><strong>/*$currentItemText$*/</strong></div>\n            </div>\n//#local l_templateID = xml_list(currentItem,\"template\")\n//#if xml_size(l_templateID)>0\n\t//#local l_templateID = xml_text(xml_get(l_templateID,0))\n\t//#include l_templateID\n//#else\n\t//#include \"./\"+currentItemID+\".htm\"  \n//#endif\n          </td>\n          <td width=\"132\" align=\"right\" valign=\"top\" bgcolor=\"#E7D7F4\">\n//#include \"./\"+\"hotnews.htm\"  \n          </td>\n        </tr>\n      </table></td>\n  </tr>\n  <tr>\n    <td><hr align=\"center\" width=\"100%%\" noshade>\n\n//#local footer = xml_text(xml_get(xml_list(xml_get(xml_list(site_file,\"footer\"),0),curLangID),0))\n<div align=\"justify\" class=\"footer\">/*$footer$*/</div>\n</td>\n</tr>\n</table>\n</body>\n</html>\n//#flush\n//#local menuSubIndex = menuSubIndex + 1\n//#end\n//#local menuMainIndex = menuMainIndex +1\n//#end\n//#local langIndex = langIndex+1\n//#end\n//#outname \"end.txt\""
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/news.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<title>NEWS</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n<LINK href=\"../cmn/styles.css\" type=text/css rel=stylesheet>\n</head>\n<body>\n//#+\n//#local l_newsList = xml_list(xml_root(xml_open(\"news.xml\")),\"news\")\n//#local l_newsIndex = 0\n//#while l_newsIndex<xml_size(l_newsList)\n//#local l_newsCurrentNews = xml_get(l_newsList,l_newsIndex)\n//#local l_newsCurrentLink = xml_attr(l_newsCurrentNews,\"link\")\n//#local l_newsCurrentNewsContent = xml_text(xml_get(xml_list(l_newsCurrentNews,curLangID),0))\n\n//#local l_newsDate = xml_attr(l_newsCurrentNews,\"date\")\n<table width=\"100%%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n   <tr> \n     <td width=\"105\" bgcolor=\"#E6E6FF\" class=\"menuheader\"><div align=\"center\" class=\"newdata\">/*$l_newsDate$*/</div></td>\n     <td width=\"303\">&nbsp;</td>\n   </tr>\n\t<tr  bgcolor=\"#E6E6FF\">\n\t<td colspan=\"2\">\n//#local l_newsScreen=1\n//#while true\n//#local l_newsCurScreen = xml_list(l_newsCurrentNews,\"scr\"+l_newsScreen)\n//#if xml_size(l_newsCurScreen)==0\n//#break\n//#endif\n//#local l_newsScreenHREF = xml_text(xml_get(l_newsCurScreen,0))\n<img src=\"../news//*$l_newsScreenHREF$*/\" alt=\"/*$\"scr\"+l_newsScreen$*/\">\n//#local l_newsScreen = l_newsScreen + 1\n//#end\n   </td>\n   </tr>\t\n   <tr bgcolor=\"#E6E6FF\"> \n       <td colspan=\"2\"><div align=\"justify\" class=\"alltext\">\n       /*$l_newsCurrentNewsContent$*/\n       </div>\n       //#if strlen(l_newsCurrentLink)>0\n       <div align=\"justify\">\n       //#if curLangID==\"rus\"\n\t\t<span class=\"rightnewsHdr\"><a href=\"/*$l_newsCurrentLink$*/\" target=\"_new\"> ...</a>\n\t\t//#else\n\t\t<span class=\"rightnewsHdr\"><a href=\"/*$l_newsCurrentLink$*/\" target=\"_new\">read more...</a>\n\t\t//#endif\n       </div>\n       //#endif\n       </td>\n    </tr>\n</table>\n<br>\n//#local l_newsIndex = l_newsIndex + 1\n//#end\n//#-\n</body>\n</html>\n//#+"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/news.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<mainnews>\n    <news priority=\"normal\" date=\"05-DEC-2005\" link=\"./gpage_aneks_ny2006.htm\">\n\t\t<scr1>../games/aneks_ny2006_scr1.gif</scr1>\n\t\t<scr2>../games/aneks_ny2006_scr3.gif</scr2>\n  \t\t<rus>&#1042;&#1099;&#1087;&#1091;&#1097;&#1077;&#1085; &#1089;&#1073;&#1086;&#1088;&#1085;&#1080;&#1082; &#1080;&#1079; &#1089;&#1077;&#1088;&#1080;&#1080; \"&#1040;&#1085;&#1077;&#1082;&#1076;&#1086;&#1090;&#1099;\" &#1085;&#1072; &#1053;&#1086;&#1074;&#1086;&#1075;&#1086;&#1076;&#1085;&#1102;&#1102; &#1090;&#1077;&#1084;&#1091;. &#1042; &#1089;&#1073;&#1086;&#1088;&#1085;&#1080;&#1082; &#1074;&#1086;&#1096;&#1083;&#1086; 60 &#1072;&#1085;&#1077;&#1082;&#1076;&#1086;&#1090;&#1086;&#1074;. &#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1087;&#1086;&#1076;&#1076;&#1077;&#1088;&#1078;&#1080;&#1074;&#1072;&#1077;&#1090; &#1087;&#1088;&#1072;&#1082;&#1090;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080; &#1074;&#1089;&#1077; &#1084;&#1086;&#1073;&#1080;&#1083;&#1100;&#1085;&#1099;&#1077; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1099; &#1089; &#1087;&#1083;&#1072;&#1090;&#1092;&#1086;&#1088;&#1084;&#1086;&#1081; MIDP-1.0</rus>\n        <eng>The collection \"Ney Year's jokes\" has been completed. The collection includes 60 jokes. It supports all MIDP-1.0 Java2ME mobile devices.</eng>\n\t</news>\n    <news priority=\"normal\" date=\"25-NOV-2005\" link=\"./gpage_slider_alpop.htm\">\n\t\t<scr1>../games/slider_alpop_scr1.gif</scr1>\n  \t\t<rus>&#1042;&#1099;&#1096;&#1077;&#1083; &#1089;&#1083;&#1072;&#1081;&#1076;&#1077;&#1088; &#1087;&#1086; &#1084;&#1091;&#1083;&#1100;&#1090;&#1092;&#1080;&#1083;&#1100;&#1084;&#1091; \"&#1040;&#1083;&#1077;&#1096;&#1072; &#1055;&#1086;&#1087;&#1086;&#1074;&#1080;&#1095; &#1080; &#1058;&#1091;&#1075;&#1072;&#1088;&#1080;&#1085; &#1047;&#1084;&#1077;&#1081;\". &#1057;&#1083;&#1072;&#1081;&#1076;&#1077;&#1088; &#1089;&#1086;&#1076;&#1077;&#1088;&#1078;&#1080;&#1090; 10 &#1082;&#1088;&#1072;&#1089;&#1086;&#1095;&#1085;&#1099;&#1093; &#1082;&#1072;&#1076;&#1088;&#1086;&#1074; &#1080;&#1079; &#1084;&#1091;&#1083;&#1100;&#1090;&#1092;&#1080;&#1083;&#1100;&#1084;&#1072; &#1080; &#1090;&#1077;&#1082;&#1089;&#1090;.</rus>\n        <eng>The slide-show \"Aleosha Popovich and Toogarin Zmey\" has been completed. The slide-show includes 10 frames from the cartoon film and texts.</eng>\n\t</news>\n    <news priority=\"normal\" date=\"10-SEP-2005\" link=\"./gpage_smscat.htm\">\n\t\t<scr1>../games/smscat_scr2.gif</scr1>\n        <scr2>../games/smscat_scr3.gif</scr2>\n  \t\t<rus>&#1047;&#1072;&#1082;&#1086;&#1085;&#1095;&#1077;&#1085;&#1072; &#1088;&#1072;&#1079;&#1088;&#1072;&#1073;&#1086;&#1090;&#1082;&#1072; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1103; \"SMS Catalog\". &#1055;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1077;&#1090; &#1087;&#1086;&#1090;&#1077;&#1085;&#1094;&#1080;&#1072;&#1083;&#1100;&#1085;&#1099;&#1084; &#1082;&#1083;&#1080;&#1077;&#1085;&#1090;&#1072;&#1084; &#1086;&#1079;&#1085;&#1072;&#1082;&#1072;&#1084;&#1083;&#1080;&#1074;&#1072;&#1090;&#1100;&#1089;&#1103; &#1089; &#1089;&#1086;&#1076;&#1077;&#1088;&#1078;&#1080;&#1084;&#1099;&#1084; &#1073;&#1072;&#1079;&#1099; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;-&#1087;&#1088;&#1086;&#1074;&#1072;&#1081;&#1076;&#1077;&#1088;&#1072;, &#1086;&#1088;&#1075;&#1072;&#1085;&#1080;&#1079;&#1086;&#1074;&#1072;&#1085;&#1085;&#1086;&#1081; &#1074; &#1091;&#1076;&#1086;&#1073;&#1085;&#1086;&#1084; &#1076;&#1088;&#1077;&#1074;&#1086;&#1074;&#1080;&#1076;&#1085;&#1086;&#1084; &#1087;&#1088;&#1077;&#1076;&#1089;&#1090;&#1072;&#1074;&#1083;&#1077;&#1085;&#1080;&#1080; &#1080; (&#1077;&#1089;&#1083;&#1080; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085; &#1087;&#1086;&#1079;&#1074;&#1086;&#1083;&#1103;&#1077;&#1090;) &#1092;&#1086;&#1088;&#1084;&#1080;&#1088;&#1086;&#1074;&#1072;&#1090;&#1100; SMS &#1089; &#1079;&#1072;&#1082;&#1072;&#1079;&#1086;&#1084; &#1087;&#1086;&#1085;&#1088;&#1072;&#1074;&#1080;&#1074;&#1096;&#1077;&#1075;&#1086;&#1089;&#1103; &#1082;&#1086;&#1085;&#1090;&#1077;&#1085;&#1090;&#1072;.</rus>\n        <eng>The \"SMS Catalog\" application has been developed. It enables for user to look through a content provider base and order liked content with automatically generated SMS (if the device is supporting).</eng>\n\t</news>\n    <news priority=\"normal\" date=\"01-AUG-2005\" link=\"./gpage_airboil.htm\">\n\t\t<scr1>../games/airboil_scr1.gif</scr1>\n        <scr2>../games/airboil_scr3.gif</scr2>\n  \t\t<rus>&#1042;&#1099;&#1096;&#1083;&#1072; &#1080;&#1075;&#1088;&#1072; \"Air Boil\". &#1048;&#1075;&#1088;&#1072; &#1103;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1072;&#1088;&#1082;&#1072;&#1076;&#1086;&#1081; &#1074;&#1099;&#1087;&#1086;&#1083;&#1085;&#1077;&#1085;&#1085;&#1086;&#1081; &#1074; &#1082;&#1083;&#1072;&#1089;&#1089;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1084; &#1089;&#1090;&#1080;&#1083;&#1077;. &#1048;&#1075;&#1088;&#1086;&#1082;&#1091; &#1090;&#1088;&#1077;&#1073;&#1091;&#1077;&#1090;&#1089;&#1103; &#1087;&#1088;&#1086;&#1093;&#1086;&#1076;&#1080;&#1090;&#1100; &#1080;&#1075;&#1088;&#1086;&#1074;&#1099;&#1077; &#1091;&#1088;&#1086;&#1074;&#1085;&#1080; &#1089; &#1085;&#1072;&#1088;&#1072;&#1089;&#1090;&#1072;&#1102;&#1097;&#1077;&#1081; &#1089;&#1083;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1100;&#1102;, &#1082;&#1072;&#1078;&#1076;&#1072;&#1103; &#1075;&#1088;&#1091;&#1087;&#1087;&#1072; &#1091;&#1088;&#1086;&#1074;&#1085;&#1077;&#1081; &#1079;&#1072;&#1082;&#1072;&#1085;&#1095;&#1080;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; &#1074;&#1089;&#1090;&#1088;&#1077;&#1095;&#1077;&#1081; &#1089; \"&#1073;&#1086;&#1089;&#1089;&#1086;&#1084;\".</rus>\n        <eng>The game \"Air Boil\" has been completed. The game is a classic style arcade game. A player should pass game stages. Game stages have different difficult of the gameplay, every group of game stages has a game \"boss\" what must be destroyed by the player.</eng>\n\t</news>\n    <news priority=\"normal\" date=\"29-JUN-2005\" link=\"./gpage_starharbor.htm\">\n\t\t<scr1>../games/starharbor_scr1.gif</scr1>\n        <scr2>../games/starharbor_scr2.gif</scr2>\n  \t\t<rus>&#1059;&#1096;&#1083;&#1072; &#1074; &#1087;&#1088;&#1086;&#1076;&#1072;&#1078;&#1091; &#1080;&#1075;&#1088;&#1072; \"Star Harbor\". &#1048;&#1075;&#1088;&#1072; &#1103;&#1074;&#1083;&#1103;&#1077;&#1090;&#1089;&#1103; &#1087;&#1089;&#1077;&#1074;&#1076;&#1086;&#1090;&#1088;&#1077;&#1093;&#1084;&#1077;&#1088;&#1085;&#1099;&#1084; &#1096;&#1091;&#1090;&#1077;&#1088;&#1086;&#1084; &#1086;&#1090; &#1087;&#1077;&#1088;&#1074;&#1086;&#1075;&#1086; &#1083;&#1080;&#1094;&#1072;. &#1048;&#1075;&#1088;&#1086;&#1082; &#1080;&#1075;&#1088;&#1072;&#1077;&#1090; &#1079;&#1072; &#1089;&#1090;&#1088;&#1077;&#1083;&#1082;&#1072; &#1090;&#1091;&#1088;&#1077;&#1083;&#1080; &#1082;&#1086;&#1089;&#1084;&#1080;&#1095;&#1077;&#1089;&#1082;&#1086;&#1075;&#1086; &#1082;&#1088;&#1077;&#1081;&#1089;&#1077;&#1088;&#1072; &#1080; &#1077;&#1075;&#1086; &#1079;&#1072;&#1076;&#1072;&#1095;&#1072; - &#1086;&#1090;&#1088;&#1072;&#1079;&#1080;&#1090;&#1100; &#1074;&#1090;&#1086;&#1088;&#1078;&#1077;&#1085;&#1080;&#1077; &#1080;&#1085;&#1086;&#1087;&#1083;&#1072;&#1085;&#1077;&#1090;&#1085;&#1099;&#1093; &#1089;&#1080;&#1083; &#1085;&#1072; &#1047;&#1077;&#1084;&#1083;&#1102;. &#1048;&#1075;&#1088;&#1072; &#1080;&#1084;&#1077;&#1077;&#1090; &#1090;&#1088;&#1080; &#1091;&#1088;&#1086;&#1074;&#1085;&#1103; &#1089;&#1083;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1080; &#1080; &#1074;&#1093;&#1086;&#1076;&#1080;&#1090; &#1074; &#1088;&#1072;&#1079;&#1088;&#1103;&#1076; timekiller &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1081;. &#1055;&#1086;&#1076;&#1076;&#1077;&#1088;&#1078;&#1080;&#1074;&#1072;&#1077;&#1090; &#1073;&#1086;&#1083;&#1077;&#1077; 100 &#1084;&#1086;&#1076;&#1077;&#1083;&#1077;&#1081; &#1090;&#1077;&#1083;&#1077;&#1092;&#1086;&#1085;&#1086;&#1074;, &#1074; &#1090;&#1086;&#1084; &#1095;&#1080;&#1089;&#1083;&#1077; &#1085;&#1077;&#1089;&#1082;&#1086;&#1083;&#1100;&#1082;&#1086; &#1095;&#1077;&#1088;&#1085;&#1086;-&#1073;&#1077;&#1083;&#1099;&#1093; &#1084;&#1086;&#1076;&#1077;&#1083;&#1077;&#1081; Nokia &#1080; Siemens.</rus>\n        <eng>The \"Star Harbor\" game has come into the market. The game is a pseudo 3d shooter. A player is a brawe star cruiser gunner and the task is to destroy both enemy cruisers and fighters that are attacking the Earth. It is a timekiller game and it has three levels of complexity. The game supports more than 100 models of mobile devices including a few black white devices of Nokia and Siemens.</eng>\n\t</news>\n\t<news priority=\"normal\" date=\"29-JUN-2005\">\n  \t\t<rus>&#1040;&#1083;&#1100;&#1092;&#1072;-&#1074;&#1077;&#1088;&#1089;&#1080;&#1103; &#1089;&#1072;&#1081;&#1090;&#1072; &#1074;&#1099;&#1083;&#1086;&#1078;&#1077;&#1085;&#1072; &#1074; &#1080;&#1085;&#1090;&#1077;&#1088;&#1085;&#1077;&#1090;. &#1050; &#1089;&#1086;&#1078;&#1072;&#1083;&#1077;&#1085;&#1080;&#1102; &#1085;&#1077; &#1074;&#1089;&#1077; &#1088;&#1072;&#1079;&#1076;&#1077;&#1083;&#1099; &#1077;&#1097;&#1077; &#1092;&#1091;&#1085;&#1082;&#1094;&#1080;&#1086;&#1085;&#1080;&#1088;&#1091;&#1102;&#1090;, &#1085;&#1086; &#1082;&#1072;&#1082; &#1075;&#1086;&#1074;&#1086;&#1088;&#1080;&#1090;&#1089;&#1103; \"..&#1101;&#1090;&#1086; &#1073;&#1086;&#1083;&#1100;&#1096;&#1086;&#1081; &#1096;&#1072;&#1075; &#1076;&#1083;&#1103; &#1074;&#1089;&#1077;&#1075;&#1086; &#1095;&#1077;&#1083;&#1086;&#1074;&#1077;&#1095;&#1077;&#1089;&#1090;&#1074;&#1072;\".</rus>\n        <eng>The alpha version of the site has been placed in the net. Unfortunately a few pages of the site are not working but we're working for it.</eng>\n\t</news>\n</mainnews>"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/partnership.htm",
    "content": "//#-\n//#excludeif true\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Sorry, the page is still under construction</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body>\n//#+\n<p align=\"center\"><strong><em><font size=\"4\">Sorry, but the page is still under \n  construction....</font></em></strong></p>\n<p align=\"center\"><img src=\"../undercon.gif\" width=\"40\" height=\"38\"></p>\n<p align=\"center\"><strong><font size=\"4\"><em>Visit us later, please...</em></font></strong></p>\n\n//#-\n</body>\n</html>\n//#+\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/rus/send_error.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>   .</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#FF9393\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../x_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>   ,    .   .</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/rus/send_ok.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>  .</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n<body bgcolor=\"#FFFFFF\">\n<div  align=\"center\">\n<table width=\"70%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#C4CFFF\">\n  <tr> \n    <td  align=\"center\" valign=\"top\"><img src=\"../i_icon.gif\" width=\"64\" height=\"64\"></td>\n      <td align=\"left\" valign=\"top\"> \n        <div align=\"left\"><br><strong>   . !</strong><br>&nbsp;</div></td>\n  </tr>\n</table>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/site.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<site>\n\t<languages>\n\t\t<lang id=\"rus\" text=\"RUS\"/>\n\t\t<lang id=\"eng\" text=\"ENG\"/>\n\t</languages>\n\n    <header>\n\t\t<rus>ColdCore</rus>\n        <eng>ColdCore</eng>\n    </header>\n\n\t<menu1>\n\t\t<item id=\"news\">\n\t\t  \t<rus>&#1053;&#1054;&#1042;&#1054;&#1057;&#1058;&#1048;</rus>\n\t\t  \t<eng>NEWS</eng>\n\t\t</item>\t\n        <item id=\"about\">\n\t\t  \t<rus>&#1054; &#1053;&#1040;&#1057;</rus>\n\t\t  \t<eng>ABOUT</eng>\n\t\t</item>\t\n        <item id=\"partnership\">\n\t\t  \t<rus>&#1055;&#1040;&#1056;&#1058;&#1053;&#1045;&#1056;&#1057;&#1058;&#1042;&#1054;</rus>\n\t\t  \t<eng>PARTNERSHIP</eng>\n\t\t</item>\t\n        <item id=\"job\">\n\t\t  \t<rus>&#1042;&#1040;&#1050;&#1040;&#1053;&#1057;&#1048;&#1048;</rus>\n\t\t  \t<eng>JOB</eng>\n\t\t</item>\t\n        <item id=\"contacts\">\n\t\t  \t<rus>&#1050;&#1054;&#1053;&#1058;&#1040;&#1050;&#1058;&#1067;</rus>\n\t\t  \t<eng>CONTACTS</eng>\n\t\t</item>\t\n\t</menu1>\n\n    <menu2>\n\t\t<textname>\n\t\t  <rus>&#1048;&#1043;&#1056;&#1067;</rus>\n          <eng>GAMES</eng>\n\t\t</textname>\n\t\t<item id=\"all\">\n\t\t\t<template>gamelist.htm</template>\n\t\t  \t<rus>&#1042;&#1057;&#1045;</rus>\n\t\t  \t<eng>ALL</eng>\n\t\t</item>\t\n        <item id=\"arcade\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1040;&#1056;&#1050;&#1040;&#1044;&#1067;</rus>\n\t\t  \t<eng>ARCADE</eng>\n\t\t</item>\t\n        <item id=\"erotic\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1069;&#1056;&#1054;&#1058;&#1048;&#1063;&#1045;&#1057;&#1050;&#1048;&#1045;</rus>\n\t\t  \t<eng>EROTIC</eng>\n\t\t</item>\t\n        <item id=\"fighting\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1044;&#1056;&#1040;&#1050;&#1048;</rus>\n\t\t  \t<eng>FIGHTING</eng>\n\t\t</item>\t\n        <item id=\"gambling\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1040;&#1047;&#1040;&#1056;&#1058;&#1053;&#1067;&#1045;</rus>\n\t\t  \t<eng>GAMBLING</eng>\n\t\t</item>\t\n        <item id=\"logic\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1051;&#1054;&#1043;&#1048;&#1063;&#1045;&#1057;&#1050;&#1048;&#1045;</rus>\n\t\t  \t<eng>PUZZLE</eng>\n\t\t</item>\t\n        <item id=\"multiplayer\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1052;&#1059;&#1051;&#1068;&#1058;&#1048;&#1055;&#1051;&#1045;&#1045;&#1056;</rus>\n\t\t  \t<eng>MULTIPLAYER</eng>\n\t\t</item>\t\n        <item id=\"clientserver\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1050;&#1051;&#1048;&#1045;&#1053;&#1058;-&#1057;&#1045;&#1056;&#1042;&#1045;&#1056;</rus>\n\t\t  \t<eng>CLIENT-SERVER</eng>\n\t\t</item>\t\n        <item id=\"quest\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1050;&#1042;&#1045;&#1057;&#1058;&#1067;</rus>\n\t\t  \t<eng>QUEST</eng>\n\t\t</item>\t\n        <item id=\"racing\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1043;&#1054;&#1053;&#1050;&#1048;</rus>\n\t\t  \t<eng>RACING</eng>\n\t\t</item>\t\n        <item id=\"shooter\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1057;&#1058;&#1056;&#1045;&#1051;&#1071;&#1051;&#1050;&#1048;</rus>\n\t\t  \t<eng>SHOOTER</eng>\n\t\t</item>\t\n        <item id=\"sport\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1057;&#1055;&#1054;&#1056;&#1058;</rus>\n\t\t  \t<eng>SPORT</eng>\n\t\t</item>\t\n\t</menu2>\n\n    <menu3>\n\t\t<textname>\n\t\t  <rus>&#1055;&#1056;&#1048;&#1051;&#1054;&#1046;&#1045;&#1053;&#1048;&#1071;</rus>\n          <eng>APPLICATIONS</eng>\n\t\t</textname>\n\t\t<item id=\"appsall\">\n            <template>gamelist.htm</template>\n\t\t  \t<rus>&#1042;&#1057;&#1045;</rus>\n\t\t  \t<eng>ALL</eng>\n\t\t</item>\t\n\t</menu3>\n\n\t<footer>\n\t\t<rus>Copyright &#169; ColdCore&#174; 2005-2007. &#1057;&#1080;&#1084;&#1074;&#1086;&#1083;&#1099; \"&#8482;\" &#1080; \"&#174;\" &#1087;&#1086;&#1082;&#1072;&#1079;&#1099;&#1074;&#1072;&#1102;&#1090; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077; &#1084;&#1072;&#1088;&#1082;&#1080; &#1080; &#1079;&#1072;&#1088;&#1077;&#1075;&#1080;&#1089;&#1090;&#1088;&#1080;&#1088;&#1086;&#1074;&#1072;&#1085;&#1085;&#1099;&#1077; &#1090;&#1086;&#1088;&#1075;&#1086;&#1074;&#1099;&#1077; &#1084;&#1072;&#1088;&#1082;&#1080; &#1080;&#1093; &#1087;&#1086;&#1083;&#1085;&#1086;&#1087;&#1088;&#1072;&#1074;&#1085;&#1099;&#1093; &#1074;&#1083;&#1072;&#1076;&#1077;&#1083;&#1100;&#1094;&#1077;&#1074;.</rus>\n        <eng>&#169; 2005-2007 ColdCore&#174;. All rights reserved. \"&#8482;\" and \"&#174;\" indicate trademarks or registered trademarks of their respective owners.</eng>\n    </footer>\n</site>"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/main/resources/wap/index.wml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n<wml>\n<card id=\"main\" title=\"COLDCORE WAP\">\n<p>\n<img src=\"/logo.wbmp\" alt=\"ColdCore(R)\"/>\n<br/><br/>\n<strong>Sorry, under construction...</strong>\n<do type=\"option\" label=\"Back\"><prev/></do>\n</p>\n</card>\n</wml>\n"
  },
  {
    "path": "jcp-tests/jcp-test-static-site/src/test/java/com/igormaznitsa/jcp/it/test/TestSite.java",
    "content": "/*\n * Copyright 2002-2019 Igor Maznitsa (http://www.igormaznitsa.com)\n *\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage com.igormaznitsa.jcp.it.test;\n\nimport org.apache.commons.io.FileUtils;\nimport org.junit.jupiter.api.Test;\n\nimport java.io.File;\nimport java.util.Iterator;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\npublic class TestSite {\n\n  private final File FOLDER_SITE = new File(System.getProperty(\"jcp.target.folder\"));\n\n  private int countFilesInDir(File dir) {\n    int cnt = 0;\n    if (dir.isDirectory()) {\n      Iterator it = FileUtils.iterateFiles(dir, null, true);\n      while (it.hasNext()) {\n        File f = (File) it.next();\n        if (f.isFile()) {\n          cnt++;\n        }\n      }\n    }\n    return cnt;\n  }\n\n  @Test\n  public void testGeneratedSite() {\n    assertEquals(342, countFilesInDir(FOLDER_SITE));\n  }\n\n}\n"
  },
  {
    "path": "jcp-tests/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>jcp-tests</artifactId>\n    <version>0-SNAPSHOT</version>\n    <packaging>pom</packaging>\n\n    <properties>\n        <jcp.test.version>7.3.0</jcp.test.version>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <junit.version>5.13.3</junit.version>\n        <maven.compiler.source>11</maven.compiler.source>\n        <maven.compiler.target>11</maven.compiler.target>\n        <maven.compiler.release>11</maven.compiler.release>\n        <gradle5.executable>gradle5</gradle5.executable>\n        <gradle6.executable>gradle6</gradle6.executable>\n        <gradle7.executable>gradle7</gradle7.executable>\n        <gradle8.executable>gradle8</gradle8.executable>\n        <gradle9.executable>gradle9</gradle9.executable>\n    </properties>\n\n    <modules>\n        <module>jcp-test-ant</module>\n        <module>jcp-test-maven</module>\n        <module>jcp-test-maven-action</module>\n        <module>jcp-test-static-site</module>\n        <module>jcp-test-javassist</module>\n        <module>jcp-test-gradle-6</module>\n        <module>jcp-test-gradle-7</module>\n        <module>jcp-test-gradle-8</module>\n        <module>jcp-test-gradle-9</module>\n        <module>jcp-test-android</module>\n    </modules>\n\n    <profiles>\n        <profile>\n            <id>java-9</id>\n            <activation>\n                <jdk>[9</jdk>\n            </activation>\n            <properties>\n                <argLine>\n                    --add-opens java.base/java.lang=ALL-UNNAMED\n                    --add-opens java.base/java.io=ALL-UNNAMED\n                    --add-opens java.base/java.util=ALL-UNNAMED\n                    --add-opens java.base/java.util.stream=ALL-UNNAMED\n                    --add-opens java.base/java.net=ALL-UNNAMED\n                    --add-opens java.base/java.nio.charset=ALL-UNNAMED\n                    --add-opens java.base/sun.nio.cs=ALL-UNNAMED\n                </argLine>\n            </properties>\n        </profile>\n        <profile>\n            <id>new-jdk</id>\n            <activation>\n                <jdk>(1.8,]</jdk>\n            </activation>\n            <modules>\n                <module>jcp-test-jep238</module>\n            </modules>\n        </profile>\n    </profiles>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>junit</groupId>\n                <artifactId>junit</artifactId>\n                <version>4.13.2</version>\n            </dependency>\n            <dependency>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.5.1</version>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n    <dependencies>\n        <dependency>\n            <groupId>com.igormaznitsa</groupId>\n            <artifactId>jcp</artifactId>\n            <version>${jcp.test.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-engine</artifactId>\n            <version>${junit.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-api</artifactId>\n            <version>${junit.version}</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-clean-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>force-clean</id>\n                        <goals>\n                            <goal>clean</goal>\n                        </goals>\n                        <phase>initialize</phase>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.igormaznitsa</groupId>\n    <artifactId>jcp-pom</artifactId>\n    <version>7.3.0</version>\n    <packaging>pom</packaging>\n\n    <url>https://github.com/raydac/java-comment-preprocessor</url>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <main.project.version>${project.version}</main.project.version>\n        <timestamp>${maven.build.timestamp}</timestamp>\n        <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>\n        <min.maven.api>3.0</min.maven.api>\n        <junit.version>5.13.4</junit.version>\n        <maven.compiler.release>11</maven.compiler.release>\n    </properties>\n\n    <issueManagement>\n        <system>GitHub Issues</system>\n        <url>https://github.com/raydac/java-comment-preprocessor/issues</url>\n    </issueManagement>\n    <inceptionYear>2011</inceptionYear>\n\n    <prerequisites>\n        <maven>${min.maven.api}</maven>\n    </prerequisites>\n\n    <developers>\n        <developer>\n            <id>raydac</id>\n            <name>Igor Maznitsa</name>\n            <email>rrg4400@gmail.com</email>\n            <url>https://www.igormaznitsa.com</url>\n            <timezone>+2</timezone>\n            <roles>\n                <role>developer</role>\n            </roles>\n        </developer>\n    </developers>\n\n    <scm>\n        <url>https://github.com/raydac/java-comment-preprocessor</url>\n        <connection>scm:git:git://github.com/raydac/java-comment-preprocessor.git</connection>\n        <developerConnection>scm:git:git@github.com:raydac/java-comment-preprocessor.git\n        </developerConnection>\n    </scm>\n\n    <organization>\n        <name>Igor Maznitsa</name>\n        <url>http://www.igormaznitsa.com</url>\n    </organization>\n\n    <licenses>\n        <license>\n            <name>The Apache Software License, Version 2.0</name>\n            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>\n            <distribution>repo</distribution>\n        </license>\n    </licenses>\n\n    <modules>\n        <module>jcp</module>\n    </modules>\n\n    <profiles>\n        <profile>\n            <id>java-9</id>\n            <activation>\n                <jdk>[9</jdk>\n            </activation>\n            <properties>\n                <argLine>\n                    --add-opens java.base/java.lang=ALL-UNNAMED\n                    --add-opens java.base/java.io=ALL-UNNAMED\n                    --add-opens java.base/java.util=ALL-UNNAMED\n                    --add-opens java.base/java.util.stream=ALL-UNNAMED\n                    --add-opens java.base/java.net=ALL-UNNAMED\n                    --add-opens java.base/java.nio.charset=ALL-UNNAMED\n                    --add-opens java.base/sun.nio.cs=ALL-UNNAMED\n                </argLine>\n            </properties>\n        </profile>\n        <profile>\n            <id>it</id>\n            <modules>\n                <module>jcp-tests</module>\n            </modules>\n        </profile>\n    </profiles>\n\n    <build>\n        <pluginManagement>\n            <plugins>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-site-plugin</artifactId>\n                    <version>3.21.0</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-plugin-report-plugin</artifactId>\n                    <version>3.15.1</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-plugin-plugin</artifactId>\n                    <version>3.8.1</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-assembly-plugin</artifactId>\n                    <version>3.7.1</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-surefire-plugin</artifactId>\n                    <version>3.5.3</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-clean-plugin</artifactId>\n                    <version>3.5.0</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-javadoc-plugin</artifactId>\n                    <version>3.12.0</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-source-plugin</artifactId>\n                    <version>3.3.1</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-gpg-plugin</artifactId>\n                    <version>3.2.8</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-compiler-plugin</artifactId>\n                    <version>3.14.0</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-enforcer-plugin</artifactId>\n                    <version>3.6.1</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-jar-plugin</artifactId>\n                    <version>3.4.2</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-shade-plugin</artifactId>\n                    <version>3.6.1</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.codehaus.mojo</groupId>\n                    <artifactId>build-helper-maven-plugin</artifactId>\n                    <version>3.4.0</version>\n                </plugin>\n            </plugins>\n        </pluginManagement>\n\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>timestamp-property</id>\n                        <goals>\n                            <goal>timestamp-property</goal>\n                        </goals>\n                        <phase>validate</phase>\n                        <configuration>\n                            <name>current.year</name>\n                            <pattern>yyyy</pattern>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  }
]